Skip to content

Commit

Permalink
Make MockServer compatible with newer (5.11.x) versions (#3437)
Browse files Browse the repository at this point in the history
Co-authored-by: Sergei Egorov <bsideup@gmail.com>
  • Loading branch information
lanwen and bsideup committed Dec 11, 2020
1 parent f033c13 commit 16c82a4
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 44 deletions.
6 changes: 4 additions & 2 deletions docs/modules/mockserver.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ Mock Server can be used to mock HTTP services by matching requests against user-
The following example shows how to start Mockserver.

<!--codeinclude-->
[Creating a MockServer container](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java) inside_block:creatingProxy
[Creating a MockServer container](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java) inside_block:creatingProxy
<!--/codeinclude-->

And how to set a simple expectation using the Java MockServerClient.

<!--codeinclude-->
[Setting a simple expectation](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java) inside_block:testSimpleExpectation
[Setting a simple expectation](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java) inside_block:testSimpleExpectation
<!--/codeinclude-->

## Adding this module to your project dependencies
Expand All @@ -33,3 +33,5 @@ testCompile "org.testcontainers:mockserver:{{latest_version}}"
</dependency>
```

Additionally, don't forget to add a [client dependency `org.mock-server:mockserver-client-java`](https://search.maven.org/search?q=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.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.testcontainers.containers;

import lombok.extern.slf4j.Slf4j;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;

@Slf4j
Expand Down Expand Up @@ -33,7 +34,9 @@ public MockServerContainer(String version) {
public MockServerContainer(DockerImageName dockerImageName) {
super(dockerImageName);

dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, DockerImageName.parse("mockserver/mockserver"));

waitingFor(Wait.forHttp("/mockserver/status").withMethod("PUT").forStatusCode(200));

withCommand("-logLevel INFO -serverPort " + PORT);
addExposedPorts(PORT);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.testcontainers.containers;

import org.junit.Rule;
import org.junit.Test;
import org.mockserver.client.MockServerClient;
import org.testcontainers.utility.DockerImageName;

import static org.hamcrest.CoreMatchers.containsString;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.rnorth.visibleassertions.VisibleAssertions.assertThat;

public class MockServerContainerRuleTest {

public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName.parse("jamesdbloom/mockserver:mockserver-5.5.4");

// creatingProxy {
@Rule
public MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE);
// }

@Test
public void shouldReturnExpectation() throws Exception {
// testSimpleExpectation {
new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.when(request()
.withPath("/person")
.withQueryStringParameter("name", "peter"))
.respond(response()
.withBody("Peter the person!"));

// ...a GET request to '/person?name=peter' returns "Peter the person!"
// }

assertThat("Expectation returns expected response body",
SimpleHttpClient.responseFromMockserver(mockServer, "/person?name=peter"),
containsString("Peter the person")
);
}
}
Original file line number Diff line number Diff line change
@@ -1,57 +1,19 @@
package org.testcontainers.containers;

import lombok.Cleanup;
import org.junit.Rule;
import org.junit.Test;
import org.mockserver.client.MockServerClient;
import org.testcontainers.utility.DockerImageName;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.rnorth.visibleassertions.VisibleAssertions.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;

public class MockServerContainerTest {

public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName.parse("jamesdbloom/mockserver:mockserver-5.5.4");

// creatingProxy {
@Rule
public MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE);
// }

private static String responseFromMockserver(MockServerContainer mockServer, String path) throws IOException {
URLConnection urlConnection = new URL(mockServer.getEndpoint() + path).openConnection();
@Cleanup BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
return reader.readLine();
}

@Test
public void shouldReturnExpectation() throws Exception {
// testSimpleExpectation {
new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.when(request()
.withPath("/person")
.withQueryStringParameter("name", "peter"))
.respond(response()
.withBody("Peter the person!"));

// ...a GET request to '/person?name=peter' returns "Peter the person!"
// }

assertThat("Expectation returns expected response body",
responseFromMockserver(mockServer, "/person?name=peter"),
containsString("Peter the person")
);
}

@Test
public void shouldCallActualMockserverVersion() throws Exception {
String actualVersion = MockServerClient.class.getPackage().getImplementationVersion();
Expand All @@ -60,14 +22,26 @@ public void shouldCallActualMockserverVersion() throws Exception {

String expectedBody = "Hello World!";

new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort());

assertTrue("Mockserver running", client.isRunning());

client
.when(request().withPath("/hello"))
.respond(response().withBody(expectedBody));

assertThat("MockServer returns correct result",
responseFromMockserver(mockServer, "/hello"),
SimpleHttpClient.responseFromMockserver(mockServer, "/hello"),
equalTo(expectedBody)
);
}
}

@Test
public void newVersionStartsWithDefaultWaitStrategy() {
DockerImageName dockerImageName = DockerImageName.parse("mockserver/mockserver:mockserver-5.11.2");
try (MockServerContainer mockServer = new MockServerContainer(dockerImageName)) {
mockServer.start();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.testcontainers.containers;

import lombok.Cleanup;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class SimpleHttpClient {
public static String responseFromMockserver(MockServerContainer mockServer, String path) throws IOException {
URLConnection urlConnection = new URL(mockServer.getEndpoint() + path).openConnection();
@Cleanup BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
return reader.readLine();
}
}

0 comments on commit 16c82a4

Please sign in to comment.