Automated Testing with Java

Everything that can be done with WireMock Cloud’s web UI can also be done via its APIs. This can be useful when automating testing, as it allows stubs to be configured and torn down on-demans by individual test cases rather than it being necessary to configure an entire test suite’s stubs manually up-front. Working this way can make your tests a lot more readable as it makes their preconditions expicit.

WireMock Cloud’s API is 100% compatible with WireMock’s. This means that WireMock can be used as a Java client for WireMock Cloud.

Adding WireMock to your project

WireMock is distributed in two different types of JAR - a standard “thin” JAR, and a “fat” standalone JAR. The latter of these contains all of WireMock’s dependencies and repackages (shades) most of these. Either can be used as a dependency in your project and which you choose depends primarily on whether you have dependencies already present that conflict with WireMock’s. Picking the standalone version generally avoids these problems but at the cost of a larger JAR download.

If you’re using Gradle you can add WireMock to your build file’s dependencies as follows:

testCompile 'com.github.tomakehurst:wiremock-jre8:2.35.0' // thin JAR
testCompile 'com.github.tomakehurst:wiremock-jre8-standalone:2.35.0' // standalone JAR

Or if you’re using Maven:

<!-- Thin JAR -->
<dependency>
  <groupId>com.github.tomakehurst</groupId>
  <artifactId>wiremock-jre8</artifactId>
  <version>2.35.0</version>
  <scope>test</scope>
</dependency>

<!-- Standalone JAR -->
<dependency>
  <groupId>com.github.tomakehurst</groupId>
  <artifactId>wiremock-jre8-standalone</artifactId>
  <version>2.35.0</version>
  <scope>test</scope>
</dependency>

Configuring your test

After you’ve created a mock API in the WireMock Cloud UI, setting up a WireMock client to it is a one-line task (you can copy-paste this from your mock API’s Settings page):

// If admin API security disabled
WireMock paymentGatewayMock = new WireMock("https", "payments-example.wiremockapi.cloud", 443);

// If admin API security enabled
WireMock paymentGatewayMock = new WireMockBuilder()
    .scheme("https")
    .host("payments-example.wiremockapi.cloud")
    .port(443)
    .authenticator(new ClientTokenAuthenticator("lksdr91283rsdjkfh981"))
    .build();

Then in your test cases you can create stubs as documented on the WireMock site:

paymentGatewayMock.register(post("/send-payment").willReturn(created()));

And make assertions about received requests:

paymentGatewayMock.verifyThat(postRequestedFor(urlPathEqualTo("/send-payment")));

Programmatic stub creation

The same approach can be taken if you want to create stubs in your API programmatically. This can be useful when you require a large number of stubs and don’t want to create them all by hand.

The example in the previous section creates an ephemeral stub i.e. one that isn’t stored persistently and will be deleted when the API is reset. To ensure that stubs created programmatically are saved, simply call persistent() during creation:

myMockApi.register(get(urlPathEqualTo("/persist-this"))
    .persistent()
    .willReturn(ok("Some body content"))
);

Example project

For a complete, working example of a Java web project using WireMock Cloud with automated tests see the WireMock Cloud demo app.