Mockserver Module
Mock Server can be used to mock HTTP services by matching requests against user-defined expectations.
Usage example
The following example shows how to start Mockserver.
MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)
And how to set a simple expectation using the Java MockServerClient.
package org.testcontainers.mockserver;
import io.restassured.config.RestAssuredConfig;
import io.restassured.config.SSLConfig;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.junit.jupiter.api.Test;
import org.mockserver.client.MockServerClient;
import org.mockserver.configuration.Configuration;
import org.mockserver.logging.MockServerLogger;
import org.mockserver.socket.tls.KeyStoreFactory;
import org.testcontainers.utility.DockerImageName;
import static io.restassured.RestAssured.given;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
class MockServerContainerTest {
public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName
.parse("mockserver/mockserver")
.withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion());
@Test
void shouldCallActualMockserverVersion() {
try ( // creatingProxy {
MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)
// }
) {
mockServer.start();
String expectedBody = "Hello World!";
try (MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort())) {
assertThat(client.hasStarted()).as("Mockserver running").isTrue();
client.when(request().withPath("/hello")).respond(response().withBody(expectedBody));
assertThat(given().when().get(mockServer.getEndpoint() + "/hello").then().extract().body().asString())
.as("MockServer returns correct result")
.isEqualTo(expectedBody);
}
}
}
@Test
void shouldCallMockserverUsingTlsProtocol() {
try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) {
mockServer.start();
String expectedBody = "Hello World!";
try (
MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.withSecure(true)
) {
assertThat(client.hasStarted()).as("Mockserver running").isTrue();
client.when(request().withPath("/hello")).respond(response().withBody(expectedBody));
assertThat(secureResponseFromMockserver(mockServer))
.as("MockServer returns correct result")
.isEqualTo(expectedBody);
}
}
}
@Test
void shouldCallMockserverUsingMutualTlsProtocol() {
try (
MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)
.withEnv("MOCKSERVER_TLS_MUTUAL_AUTHENTICATION_REQUIRED", "true")
) {
mockServer.start();
String expectedBody = "Hello World!";
try (
MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.withSecure(true)
) {
assertThat(client.hasStarted()).as("Mockserver running").isTrue();
client.when(request().withPath("/hello")).respond(response().withBody(expectedBody));
assertThat(secureResponseFromMockserver(mockServer))
.as("MockServer returns correct result")
.isEqualTo(expectedBody);
}
}
}
@Test
void newVersionStartsWithDefaultWaitStrategy() {
try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) {
mockServer.start();
}
}
private static String secureResponseFromMockserver(MockServerContainer mockServer) {
return given()
.config(
RestAssuredConfig
.config()
.sslConfig(
SSLConfig
.sslConfig()
.sslSocketFactory(
new SSLSocketFactory(
new KeyStoreFactory(Configuration.configuration(), new MockServerLogger())
.sslContext()
)
)
)
)
.baseUri(mockServer.getSecureEndpoint())
.get("/hello")
.body()
.asString();
}
}
Adding this module to your project dependencies
Add the following dependency to your pom.xml/build.gradle file:
testImplementation "org.testcontainers:testcontainers-mockserver:2.0.1"
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-mockserver</artifactId>
<version>2.0.1</version>
<scope>test</scope>
</dependency>
Additionally, don't forget to add a client dependency org.mock-server:mockserver-client-java
to be able to set expectations, it's not provided by the testcontainers module. Client version should match to the version in a container tag.