Running MockServer
MockServer is flexible and support numerous usage patterns.
MockServer can be run:
- via a Maven Plugin as part of a Maven build cycle
- programmatically via a Java API in an @Before or @After method
- using a JUnit 4 @Rule via a @Rule annotated field in a JUnit 4 test
- using a JUnit 5 Test Extension via a @ExtendWith annotated JUnit 5 class
- from the command line as a stand-alone process in a test environment
- as a deployable WAR to an existing application server
- as a Node.js (npm) module from any Node.js code
- as a Grunt plugin as part of a Grunt build cycle
- as a Docker container in any Docker enabled environment
- via a Helm chart in any Kubernetes environment
MockServer is available as:
- a stand alone Netty web server that is fully self contained
- a deployable WAR that runs on any JEE web server
- a maven plugin
- an npm plugin
- a Grunt plugin
- a fully encapsulated Docker container
- a Helm chart
- a Homebrew package
It is also possible to build and run MockServer directly from source code
To simplify configuration all MockServer versions (except the deployable WAR) only use a single port to support HTTP, HTTPS and SOCKS. This is achieved by dynamically detecting if the client is using HTTP, HTTPS or SOCKS.
Maven Plugin
To run MockServer as part of your build add the following plugin to your pom.xml:
<plugin>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-maven-plugin</artifactId>
<version>5.9.0</version>
<configuration>
<serverPort>1080</serverPort>
<logLevel>DEBUG</logLevel>
<initializationClass>org.mockserver.maven.ExampleInitializationClass</initializationClass>
</configuration>
<executions>
<execution>
<id>process-test-classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<phase>verify</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
This will start MockServer during the process-test-classes phase and will stop MockServer during the verify phase. For more details about Maven build phases see: Introduction to the Build Lifecycle.
This ensures that any integration tests you run during the test or integration-test phases can use MockServer on the port specified.
It is also possible to run MockServer as a forked JVM using the runForked and stopForked goals as follows:
<plugin>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-maven-plugin</artifactId>
<version>5.9.0</version>
<configuration>
<serverPort>1080</serverPort>
<logLevel>DEBUG</logLevel>
</configuration>
<executions>
<execution>
<id>process-test-classes</id>
<phase>process-test-classes</phase>
<goals>
<goal>runForked</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<phase>verify</phase>
<goals>
<goal>stopForked</goal>
</goals>
</execution>
</executions>
</plugin>
Stop MockServer Even When Tests Fail
If you use the runForked goal as above and the test phase fails (because a test has failed) MockServer will not be stopped as Maven does not run any more phases after a phase has failed. In the case above the verify phase is not run if a test fails so the forked MockServer will not be stopped.
If you want to ensure MockServer is stopped even when there are test failures make sure you use start and stop goals as these run MockServer on a separate thread that is stopped however maven exits (even if a test fails).
Alternatively a TestListener can be used with maven-surefire-plugin to ensure that MockServer is stopped even when a test fails, as follows:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<properties>
<property>
<name>listener</name>
<value>org.mockserver.maven.StopMockServerTestListener</value>
</property>
</properties>
</configuration>
</plugin>
The Maven plugin can also be used from the command line to start and stop MockServer, as follows:
To run MockServer synchronously and block:
mvn mockserver:run
To run MockServer asynchronously as a forked JVM:
mvn mockserver:runForked
To stop a forked instance of MockServer running on the same machine:
mvn mockserver:stopForked
The stopForked goal does assumes that MockServer is running on the same physical machine as it uses 127.0.0.1 to communicate with MockServer stop socket.
The Maven plugin has the following goals:
- start - start MockServer, do not block, but stop when build ends
- stop - stop a MockServer started earlier as part of the current build
- run - run MockServer and block waiting for requests (timeout config if provided limits how long to block for)
- runForked - run MockServer as separate forked JVM, do not block, stay alive when build ends
- stopForked - stop a forked MockServer, previously started by a runForked goal
The Maven plugin can be configured with the following properties:
- serverPort - The port the MockServer listens for incoming request. Port unification is used to support both HTTP and HTTPS on the same port (required: true)
- proxyRemotePort - The port proxied requests are forwarded to (required: false)
- proxyRemoteHost - The host proxied requests are forwarded to (required: false)
- timeout - How long to block waiting for MockServer, after the timeout the plugin will shutdown MockServer, used by run goal, 0 means wait indefinitely (required: false, default: 0)
- logLevel - The logging level (required: false, default: INFO)
- skip - Prevent the plugin from running (required: false, default: false)
- initializationClass - To enable the creation of default expectations a class can be specified to initialize expectations in MockServer, this class must implement org.mockserver.client.initialize.PluginExpectationInitializer interface. The initializeExpectations(MockServerClient mockServerClient) method will be called once MockServer has been started. Note: that the plugin must be started during the process-test-classes to ensure that the initialization class has been compiled from either src/main/java or src/test/java locations. In addition the initializer can only be used with start and run goals, it will not work with the runForked goal as a JVM is forked with a separate classpath. (required: false, default: false)
Client API - starting and stopping
Use the client API to run MockServer programmatically.
First add the following maven dependency:
<!-- mockserver -->
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-netty</artifactId>
<version>5.9.0</version>
</dependency>
To start the server or proxy create a client, for example by using one of the start factory methods ClientAndServer.startClientAndServer as follows:
Add includes:
import static org.mockserver.integration.ClientAndServer.startClientAndServer;
Add fields:
private ClientAndServer mockServer;
Use factory method to start server and client when appropriate, for example in @Before method:
@Before
public void startMockServer() {
mockServer = startClientAndServer(1080);
}
Stop server and client when appropriate, for example in @After method:
@After
public void stopMockServer() {
mockServer.stop();
}
The mockserver-example project contains an example test called BookPageIntegrationTest that demonstrates a fully working example.
Running MockServer via a JUnit 4 @Rule
MockServer can be run using the MockServerRule. The MockServerRule starts MockServer (for both mocking and proxying) on a free port before the any test runs and stops MockServer after all tests have completed.
An instance of MockServerClient is assigned to any field in the unit test of type org.mockserver.client.MockServerClient. Alternatively an instance of MockServerClient can be retrieved from the MockServerRule using the method getClient().
@Rule
public MockServerRule mockServerRule = new MockServerRule(this);
private MockServerClient mockServerClient;
The MockServerRule can be added to your project by including the following maven dependency:
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-junit-rule</artifactId>
<version>5.9.0</version>
</dependency>
Any test method can now use the mockServerClient field to create expectation or verify requests.
The MockServerRule has the following constructors:
/**
* Start MockServer prior to test execution and stop MockServer after the tests have completed.
* This constructor dynamically allocates a free port for MockServer to use.
*
* @param target an instance of the test being executed
*/
public MockServerRule(Object target);
/**
* Start MockServer prior to test execution and stop MockServer after the tests have completed.
* This constructor dynamically allocates a free port for MockServer to use.
*
* @param target an instance of the test being executed
* @param perTestSuite indicates how many instances of MockServer are created
* if true a single MockServer is created per JVM
* if false one instance per test class is created
*/
public MockServerRule(Object target, boolean per TestSuite);
/**
* Start the proxy prior to test execution and stop the proxy after the tests have completed.
* This constructor dynamically create a proxy that accepts HTTP(S) requests on the specified port
*
* @param target an instance of the test being executed
* @param port the HTTP(S) port for the proxy
*/
public MockServerRule(Object target, Integer... ports);
/**
* Start the proxy prior to test execution and stop the proxy after the tests have completed.
* This constructor dynamically create a proxy that accepts HTTP(S) requests on the specified port
*
* @param target an instance of the test being executed
* @param perTestSuite indicates how many instances of MockServer are created
* @param port the HTTP(S) port for the proxy
* if true a single MockServer is created per JVM
* if false one instance per test class is created
*/
public MockServerRule(Object target, boolean per TestSuite, Integer... ports);
Running MockServer via a JUnit 5 Test Extension
MockServer can be run using the Test Extension MockServerExtension. The MockServerExtension starts MockServer (for both mocking and proxying) before the any test runs and stops MockServer after all tests have completed.
The port(s) MockServer uses can be controlled using MockServerSettings
An instance of MockServerClient or ClientAndServer is injected into any method using Parameter Resolution this includes: constructors, lifecycle methods (like @BeforeEach / @BeforeAll), or test methods.
The MockServerExtension Test Extension can be added to your project by including the following maven dependency:
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-junit-jupiter</artifactId>
<version>5.9.0</version>
</dependency>
The following code examples show how to use the MockServerExtension Test Extension.
@ExtendWith(MockServerExtension.class)
@MockServerSettings(ports = {8787, 8888})
class ExampleTestClass {
private final ClientAndServer client;
public ExampleTestClass(ClientAndServer client) {
this.client = client;
}
@Test
void testSomething() {
// ...
}
}
@ExtendWith(MockServerExtension.class)
class ExampleTestClass {
private final ClientAndServer client;
public ExampleTestClass(ClientAndServer client) {
this.client = client;
}
@Test
void testSomething() {
// ...
}
}
@ExtendWith(MockServerExtension.class)
class ExampleTestClass {
private MockServerClient client;
@BeforeEach
public void beforeEachLifecyleMethod(MockServerClient client) {
this.client = client;
}
@Test
void testSomething() {
// ...
}
}
@ExtendWith(MockServerExtension.class)
class ExampleTestClass {
@Test
void testSomething(MockServerClient client) {
// ...
}
}
Running From Command Line
MockServer can be run from the command line in the following ways:
- using homebrew i.e. brew install mockserver && mockserver
- using java directly i.e. java -jar mockserver-netty-5.9.0-jar-with-dependencies.jar
- using maven plugin i.e. mvn org.mock-server:mockserver-maven-plugin:5.9.0:runForked
- using docker i.e. docker run -d --rm -p mockserver/mockserver
Running From Command Line - Using Homebrew
Homebrew, a packaging manager for OS X (i.e. Apple Mac), can be used to install MockServer, as follows:
brew install mockserver
The MockServer formula in Homebrew performs the following actions:
- installed the binaries and scripts
- creates the log directory
- add the scripts to the PATH variable
Once the MockServer has been installed by Homebrew it is available from any command shell as the mockserver command
The mockserver command supports the following options:
mockserver -serverPort <port> [-proxyRemotePort <port>] [-proxyRemoteHost <hostname>] [-logLevel <level>] [-jvmOptions <system parameters>]
valid options are:
-serverPort <port> The HTTP, HTTPS, SOCKS and HTTP CONNECT
port(s) for both mocking and proxying
requests. Port unification is used to
support all protocols for proxying and
mocking on the same port(s). Supports
comma separated list for binding to
multiple ports.
-proxyRemotePort <port> Optionally enables port forwarding mode.
When specified all requests received will
be forwarded to the specified port, unless
they match an expectation.
-proxyRemoteHost <hostname> Specified the host to forward all proxy
requests to when port forwarding mode has
been enabled using the proxyRemotePort
option. This setting is ignored unless
proxyRemotePort has been specified. If no
value is provided for proxyRemoteHost when
proxyRemotePort has been specified,
proxyRemoteHost will default to \"localhost\".
-logLevel <level> Optionally specify log level using SLF4J levels:
TRACE, DEBUG, INFO, WARN, ERROR, OFF or Java
Logger levels: FINEST, FINE, INFO, WARNING,
SEVERE or OFF. If not specified default is INFO
-jvmOptions <level> Specified generic JVM options or system properties.
i.e. mockserver -logLevel INFO -serverPort 1080,1081 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
For example run the MockServer, as follows:
mockserver -logLevel INFO -serverPort 1080
Running From Command Line - Using Java
MockServer can be run directly from the command line using java directly as follow:
download mockserver-netty-5.9.0-jar-with-dependencies.jar from Maven Central
-
java -jar <path to mockserver-netty-5.9.0-jar-with-dependencies.jar> -serverPort <port>
The command line supports the following options:
java -jar <path to mockserver-jetty-jar-with-dependencies.jar> -serverPort <port> [-proxyRemotePort <port>] [-proxyRemoteHost <hostname>] [-logLevel <level>]
valid options are:
-serverPort <port> The HTTP, HTTPS, SOCKS and HTTP CONNECT
port(s) for both mocking and proxying
requests. Port unification is used to
support all protocols for proxying and
mocking on the same port(s). Supports
comma separated list for binding to
multiple ports.
-proxyRemotePort <port> Optionally enables port forwarding mode.
When specified all requests received will
be forwarded to the specified port, unless
they match an expectation.
-proxyRemoteHost <hostname> Specified the host to forward all proxy
requests to when port forwarding mode has
been enabled using the proxyRemotePort
option. This setting is ignored unless
proxyRemotePort has been specified. If no
value is provided for proxyRemoteHost when
proxyRemotePort has been specified,
proxyRemoteHost will default to \"localhost\".
-logLevel <level> Optionally specify log level using SLF4J levels:
TRACE, DEBUG, INFO, WARN, ERROR, OFF or Java
Logger levels: FINEST, FINE, INFO, WARNING,
SEVERE or OFF. If not specified default is INFO
i.e. java -jar ./mockserver-jetty-jar-with-dependencies.jar -serverPort 1080 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
For example:
java -jar ~/Downloads/mockserver-netty-5.9.0-jar-with-dependencies.jar -serverPort 1080,1081 -logLevel INFO
All interactions with the MockServer are logged including setting up expectations, matching expectations, clearing expectations and verifying requests. This log information can be particularly helpful when trying to debug why a test is failing or expectations are not being matched.
The argument logLevel can be used to set the log level, as shown above. It is also possible to further customise where loggers send log events by overriding the default logging configuration.
Running From Command Line - Using Maven Plugin
MockServer can be run directly from the command line and using the mockserver-maven-plugin as follow:
mvn -Dmockserver.serverPort=1080 -Dmockserver.logLevel=INFO org.mock-server:mockserver-maven-plugin:5.9.0:runForked
When run from the command line the Maven plugin can be configured with the following properties:
- mockserver.serverPort - The port the MockServer listens for incoming request. Port unification is used to support both HTTP and HTTPS and proxying on the same port (required: false)
- mockserver.logLevel - The logging level (required: false, default: INFO)
The runForked goal of the mockserver-maven-plugin will fork a JVM process containing the Netty based MockServer. To stop the forked JVM process use the stopForked goal, as follows:
mvn -Dmockserver.serverPort=1080 org.mock-server:mockserver-maven-plugin:5.9.0:stopForked
For more information on the mockserver-maven-plugin see the section on MockServer Maven Plugin
Web Archive (WAR)
To run as a WAR deployed on any JEE web server:
- download mockserver-war-5.9.0.war from Maven Central
- deploy mockserver-war-5.9.0.war to any JEE web server
WAR Context Path
The WAR context path is ignored from all request matching for path.
The MockServerClient constructor includes an argument for the context path that the WAR has been deployed to, as follows:
public MockServerClient(String host, int port, String contextPath)
NPM Module & MockServer Grunt Plugin
The node module can be used to start and stop MockServer as a node module or as a Grunt plugin.
You may install this plugin / node module with the following command:
npm install mockserver-node --save-dev
Node Module
To start or stop the MockServer from any Node.js code you need to import this module using require('mockserver-node') as follows:
var mockserver = require('mockserver-node');
Then you can use either the start_mockserver or stop_mockserver functions as follows:
var mockserver = require('mockserver-node');
mockserver.start_mockserver({
serverPort: 1080,
trace: true
});
// do something
mockserver.stop_mockserver({
serverPort: 1080
});
MockServer uses port unification to support HTTP, HTTPS, SOCKS, HTTP CONNECT, Port Forwarding Proxying on the same port. A client can then connect to the single port with both HTTP and HTTPS as the socket will automatically detected SSL traffic and decrypt it when required.
Grunt Plugin
If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins.
In your project's Gruntfile, add a section named start_mockserver and stop_mockserver to the data object passed into grunt.initConfig().
The following example will result in a both a MockServer being started on ports 1080 and 1080.
grunt.initConfig({
start_mockserver: {
start: {
options: {
serverPort: 1080,
trace: true
}
}
},
stop_mockserver: {
stop: {
options: {
serverPort: 1080
}
}
}
});
grunt.loadNpmTasks('mockserver-node');
Request Log
The request log will only be captured in MockServer if the log level is INFO (or more verbose, i.e. DEBUG or TRACE) therefore to capture the request log and use the /retrieve endpoint ensure either the option trace: true or the command line switch --verbose is set.Grunt Plugin & NPM Module Options
options.serverPort
Type: Integer Default: undefined
The HTTP, HTTPS, SOCKS and HTTP CONNECT port(s) for both mocking and proxying requests. Port unification is used to support all protocols for proxying and mocking on the same port(s). Supports comma separated list for binding to multiple ports.
options.proxyRemotePort
Type: Integer Default: undefined
Optionally enables port forwarding mode. When specified all requests received will be forwarded to the specified port, unless they match an expectation.
options.proxyRemoteHost
Type: String Default: undefined
Specified the host to forward all proxy requests to when port forwarding mode has been enabled using the proxyRemotePort option. This setting is ignored unless proxyRemotePort has been specified. If no value is provided for proxyRemoteHost when proxyRemotePort has been specified, proxyRemoteHost will default to "localhost".
options.artifactoryHost
Type: String Default: oss.sonatype.org
This value specifies the name of the artifact repository host.
options.artifactoryPath
Type: String Default: /content/repositories/releases/org/mock-server/mockserver-netty/
This value specifies the path to the artifactory leading to the mockserver-netty jar with dependencies.
options.mockServerVersion
Type: String Default: 5.9.0
This value specifies the artifact version of MockServer to download.
Note: It is also possible to specify a SNAPSHOT version to get the latest unreleased changes.
options.verbose
Type: Boolean Default: false
This value indicates whether the MockServer logs should be written to the console. In addition to logging additional output from the grunt task this options also sets the logging level of the MockServer to INFO. At INFO level all interactions with the MockServer including setting up expectations, matching expectations, clearing expectations and verifying requests are written to the log.
Note: It is also possible to use the --verbose command line switch to enabled verbose level logging from the command line.
options.trace
Type: Boolean Default: false
This value sets the logging level of the MockServer to TRACE. At TRACE level (in addition to INFO level information) all matcher results, including when specific matchers fail (such as HeaderMatcher) are written to the log.
options.javaDebugPort
Type: Integer Default: undefined
This value indicates whether Java debugging should be enabled and if so which port the debugger should listen on. When this options is provided the following additional option is passed to the JVM:
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + javaDebugPort
Note: suspend=y is used so the MockServer will pause until the debugger is attached. The grunt task will wait 50 seconds for the debugger to be attached before it exits with a failure status.
options.jvmOptions
Type: String Default: undefined
This value allows any system properties to be passed to the JVM that runs MockServer, for example:
start_mockserver: {
options: {
serverPort: 1080,
jvmOptions: "-Dmockserver.enableCORSForAllResponses=true"
}
}
options.startupRetries
Type: Integer Default: if javaDebugPort is not set 110, but if javaDebugPort is set 500
This value indicates the how many times we will call the check to confirm if the mock server started up correctly. It will default to 110 which will take about 11 seconds to complete, this is normally long enough for the server to startup. The server can take longer to start up if Java debugging is enabled so this will default to 500. The default will, in some cases, need to be overridden as the JVM may take longer to start up on some architectures, e.g. Mac seems to take a little longer.
Docker Container
The typical sequence for running the MockServer docker image is as follows: In addition it is possible to customise how the container is run.Install Docker
To install Docker see the installation instructions.
Pull MockServer Image
To pull the MockServer Docker image use the pull command, as follows:
docker pull mockserver/mockserver
This is not strictly necessary as the image will be automatically pulled if it does not exist when the run command is used. However, using the pull command will ensure the latest version of the image is downloaded.
Run MockServer Container
Then to run MockServer as a Docker container run the following command:
docker run -d --rm -P mockserver/mockserver
The -P switch in this command tells Docker to map all ports exported by the MockServer container to dynamically allocated ports on the host machine.
To view information about the MockServer container, including which dynamic ports have been used run the following command:
docker ps
Configure Port Mapping
This MockServer docker container exports the following port:
- serverPort 1080
To specify which ports (on the host machine) should be mapped to the MockServer docker container use the -p <host port>:<container port> option, as follows:
docker run -d --rm -p <serverPort>:1080 mockserver/mockserver
For example:
docker run -d --rm -p 1080:1080 mockserver/mockserver
Modifying Default Command
By default when the MockServer container runs it executes a bash script passing three command line options, as follows
/opt/mockserver/run_mockserver.sh -serverPort 1080 -logLevel INFO
It is possible to pass alternative arguments to the entrypoint for the container, by appending arguments to the end of the run command, as follows:
docker run -d --rm -p 1080:1080 mockserver/mockserver -serverPort 1080 -logLevel INFO
For following command can be used to view the available command line switches:
docker run mockserver/mockserver ""
Error: At least 'serverPort' must be provided
run_mockserver.sh -serverPort <port> [-proxyRemotePort <port>] [-proxyRemoteHost <hostname>] [-logLevel <level>] [-jvmOptions <system parameters>]
valid options are:
-serverPort <port> The HTTP, HTTPS, SOCKS and HTTP CONNECT
port(s) for both mocking and proxying
requests. Port unification is used to
support all protocols for proxying and
mocking on the same port(s). Supports
comma separated list for binding to
multiple ports.
-proxyRemotePort <port> Optionally enables port forwarding mode.
When specified all requests received will
be forwarded to the specified port, unless
they match an expectation.
-proxyRemoteHost <hostname> Specified the host to forward all proxy
requests to when port forwarding mode has
been enabled using the proxyRemotePort
option. This setting is ignored unless
proxyRemotePort has been specified. If no
value is provided for proxyRemoteHost when
proxyRemotePort has been specified,
proxyRemoteHost will default to \"localhost\".
-logLevel <level> Optionally specify log level using SLF4J levels:
TRACE, DEBUG, INFO, WARN, ERROR, OFF or Java
Logger levels: FINEST, FINE, INFO, WARNING,
SEVERE or OFF. If not specified default is INFO
-jvmOptions <system parameters> Specified generic JVM options or system properties.
i.e. /opt/mockserver/run_mockserver.sh -serverPort 1080,1081 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com -jvmOptions -logLevel INFO "-Dmockserver.enableCORSForAllResponses=true -Dmockserver.sslSubjectAlternativeNameDomains='org.mock-server.com,mock-server.com'"
Then the appropriate options can be specified, for example, to setup a port forwarding proxy (from 0.0.0.0:1080 to www.mock-server.com:80) using the following command:
docker run -d --rm -p 1080:1080 mockserver/mockserver -serverPort 1080 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com
Interactive Shell
It is possible to launch the container with an interactive bash shell by modifying the entrypoint as follows:
docker run -it -p 1080:1080 --entrypoint "/bin/bash" mockserver/mockserver
Note: in this example above the -d flag (for daemon) has been replaced with -i (to stdin open) and -t (for pseudo-tty) to ensure docker creates the container in the foreground with an attached stdin, see the docker documentation for more details.
Docker Compose
MockServer can be run using docker compose by adding the container as a service.
The MockServer container uses an entrypoint, so it is possible to configure the MockServer by specifying the command line flags using by specifying the command, as follows:
version: "2.4"
services:
mockServer:
image: mockserver/mockserver:mockserver-5.9.0
command: -logLevel DEBUG -serverPort 1090 -proxyRemotePort 80 -proxyRemoteHost www.mock-server.com -jvmOptions "-Dmockserver.sslSubjectAlternativeNameDomains='org.mock-server.com,mock-server.com'"
ports:
- 1080:1090
It is also possible to configure the MockServer by setting environment variables, as follows:
version: "2.4"
services:
mockServer:
image: mockserver/mockserver:mockserver-5.9.0
ports:
- 1080:1090
environment:
LOG_LEVEL: "DEBUG"
SERVER_PORT: 1090
PROXY_REMOTE_PORT: 80
PROXY_REMOTE_HOST: www.mock-server.com
JVM_OPTIONS: -Dmockserver.sslSubjectAlternativeNameDomains='org.mock-server.com,mock-server.com'
It is also possible to configure the MockServer by mounting a volume containing a properties file or JSON expectation initializer, as follows:
version: "2.4"
services:
mockServer:
image: mockserver/mockserver:mockserver-5.9.0
ports:
- 1080:1080
environment:
MOCKSERVER_PROPERTY_FILE: /config/mockserver.properties
MOCKSERVER_INITIALIZATION_JSON_PATH: /config/initializerJson.json
volumes:
- type: bind
source: .
target: /config
Deploying MockServer Helm Chart
To run MockServer in Kubernetes the easiest way is to use the existing MockServer helm chart.
This is available by using www.mock-server.com as a chart repo, with the following command:
helm upgrade --install --namespace mockserver mockserver http://www.mock-server.com/mockserver-5.9.0.tgz
OR
If you have helm chart source folder (i.e. you have the repository cloned):
helm upgrade --install --namespace mockserver mockserver helm/mockserver
The two commands above will install MockServer into a namespace called mockserver with default configuration (as per the embedded values.yaml).
MockServer will then be available on domain name mockserver.mockserver.svc.cluster.local, as long as the namespace you are calling from isn't prevented (by network policy) to call the mockserver namespace.
To view the logs:
kubectl -n mockserver logs --tail=100 -l app=mockserver,release=mockserver
To wait until the deployment is complete run:
kubectl -n mockserver rollout status deployments mockserver
To check the status of the deployment without waiting, run the following command and confirm the mockserver has the Running status:
kubectl -n mockserver get po -l release=mockserver
Basic MockServer Configuration
Modify the arguments used to start the docker container by setting values explicitly using --set, as follows:
helm upgrade --install --namespace mockserver --set app.serverPort=1080 --set app.logLevel=INFO mockserver http://www.mock-server.com/mockserver-5.9.0.tgz
The following values are supported:
- app.serverPort (default: 1080)
- app.logLevel (default: INFO)
- app.proxyRemoteHost (no default)
- app.proxyRemotePort (no default)
- app.jvmOptions (no default)
- image.snapshot (default: false) - set true to use latest snapshot version
For example configure a proxyRemoteHost and proxyRemotePort, as follows:
helm upgrade --install --namespace mockserver --set app.serverPort=1080 --set app.proxyRemoteHost=www.mock-server.com --set app.proxyRemotePort=443 mockserver http://www.mock-server.com/mockserver-5.9.0.tgz
Double check the correct arguments have been passed to the pod, as follows:
kubectl -n mockserver logs -l app=mockserver,release=mockserver
Detailed MockServer Configuration
The MockServer helm chart also supports providing detailed configuration such as:
- a properties file to configure all MockServer properties, or
- a json expectation initialization file to initialize expectations at start-up.
This is done by deploying a configmap to kubernetes with files embedded in the yaml as shown in mockserver-config helm chart.
The MockServer helm chart to configure to control how to mount the files from the configmap, as follows:
- app.mountConfigMap (default: false) - enables the mounting of the configmap into the MockServer container file system
- app.mountedConfigMapName (default: mockserver-config) - name of the configmap (in the same namespace) to mount
- app.propertiesFileName (default: mockserver.properties) - name of the property file in the configmap
- app.initializationJsonFileName (default: initializerJson.json) - name of the JSON initialization file in the configmap
helm upgrade --install --namespace mockserver --set app.mountConfigMap=true --set app.mountedConfigMapName=mockserver-config --set app.propertiesFileNamem=mockserver.properties --set app.initializationJsonFileName=initializerJson.json mockserver helm/mockserver
MockServer URL
Local Kubernetes Cluster (i.e. minikube, microk8s)
If the service type hasn't been modified the following will provide the MockServer URL from outside the cluster.
export NODE_PORT=$(kubectl get -n mockserver -o jsonpath="{.spec.ports[0].nodePort}" services mockserver)
export NODE_IP=$(kubectl get nodes -n mockserver -o jsonpath="{.items[0].status.addresses[0].address}")
export MOCKSERVER_HOST=$NODE_IP:$NODE_PORT
echo http://$MOCKSERVER_HOST
To test the installation the following curl command should return the ports MockServer is bound to:
curl -v -X PUT http://$MOCKSERVER_HOST/status
Docker for Desktop
Docker for Desktop creates automatic port bindings for LoadBalancer or NodePort services.
In addition on MacOS Docker for Desktop runs inside Hyperkit so the node IP address is not reachable, therefore the only way to call NodePort or LoadBalancer services is via the port bindings added by Docker for Desktop.
If the service type hasn't been modified the following will provide the MockServer URL from outside the cluster.
export NODE_PORT=$(kubectl get -n mockserver -o jsonpath="{.spec.ports[0].nodePort}" services mockserver)
export MOCKSERVER_HOST=127.0.0.1:$NODE_PORT
echo http://$MOCKSERVER_HOST
Outside Remote Kubernetes Cluster (i.e. Azure AKS, AWS EKS, etc)
kubectl -n mockserver port-forward svc/mockserver 1080:1080 &
export MOCKSERVER_HOST=127.0.0.1:1080
echo http://$MOCKSERVER_HOST
Inside Kubernetes Cluster
If a DNS server has been installed in the Kubernetes cluster the following DNS name should be available mockserver.<namespace>.svc.cluster.local, i.e. mockserver.mockserver.svc.cluster.local
Helm Delete
To completely remove the chart:
helm delete mockserver --purge
Build & Run From Source
MockServer is written in Java and built using maven. The maven wrapper is used so maven does not need to be installed but Java JDK 8 or higher does need to be installed.
First clone the repository as follows:
git clone https://github.com/jamesdbloom/mockservice.git
cd mockserver
Next use maven to build an executable jar containing all dependencies as follows:
./mvnw clean package
This will produce a jar file under the target directory called, as follows:
mockserver-netty/target/mockserver-netty-5.9.0-jar-with-dependencies.jar
Run MockServer then using the executable jar as per the instruction above in Running From The Command Line