Mock server is a configurable web server for testing http calls
We already have a lot of mock servers, but them rarely offers a good level of reuse for stubs. In an attempt to solve this problem, we create a new mock server which the focus is exactly this, reuse of stubs.
Instead of providing a fluent api to build a stub, the stubbing is done by providing an implementation of the RequestHandler interface, which was two methods:
route, which tells when this stub will be used, and handle which tells how the request will be handled to return a response.
Maven:
<dependency>
<groupId>br.com.leonardoferreira</groupId>
<artifactId>mock-server</artifactId>
<version>${mock-server.version}</version>
<scope>test</scope>
</dependency> Gradle:
testImplementation("br.com.leonardoferreira:mock-server:${mockServerVersion}")Before starting the server, some settings can be made. To do this, we can use the static methods on the MockServer class.
Example:
MockServer.port(8888); // the default is 8080
MockServer.basePath("/my-server"); // the default is "/"
MockServer.hostname("127.0.0.1"); // the default is "localhost"We recommend using the default values and replace them only if you really need.
To start the server, we just need to call the start method on the MockServer class.
Example:
MockServer.start();The same applies to stop, example:
MockServer.stop();To teach the server to respond to a request, you need to add a handler to the server.
Example:
MockServer.addHandler(new MyCustomRequestHandler()); To create an implementation of RequestHandler interface, we need to provide two methods: route, which tells when this stub will be used, and handle which tells how the request will be handled to return a response.
Example:
public class MyCustomRequestHandler implements RequestHandler {
@Override
public Route route() {
return Route.builder()
.method(HttpMethod.GET)
.url("/my-path")
.build();
}
@Override
public Response handle(final Request request) {
return Response.builder()
.status(200)
.body(Map.of("greeting", "Hello world"))
.build();
}
}Providing this RequestHandler all calls on http://localhost:8080/my-path, will return a response with status 200 ok, and the following body:
{
"greeting": "Hello world"
}Route is the object that will be used to match when the request is eligible to be handled by certain RequestHandler.
In Route.builder(), we can add parameters that will be used to match. Full example:
Route.builder()
.method(HttpMethod.GET)
.url("/my-path")
.queryParams(
QueryParam.of("myParamName", "myParamValue")
)
.headers(
Header.of("x-my-header", "x-my-header-value")
)
.build();Response is the object that will be sent to the server and will be used to create the HTTP response.
Example:
Response.builder()
.status(200)
.body(new CustomObjectResponse("str", 1))
.headers(
Header.of("x-custom-response-header", "customValue")
)
.build();All the asserts can be made using RequestHandlerJournal which will be returned when a new RequestHandler is added.
Example:
@Test
void shouldTestSomething() {
final RequestHandlerJournal myCustomRequestHandlerJournal = MockServer.addHandler(new MyCustomRequestHandler());
// ...
assertEquals(1, myCustomRequestHandlerJournal.requestCount());
final Request request = myCustomRequestHandlerJournal.firstRequest();
// some others asserts with first request ...
final CustomRequest cr = request.bodyAs(CustomRequest.class);
// some others asserts with request body...
}- Both bodies, request body and response body, will always be treated as json;
