Wiremock and Response Transformer
I wanted to test a scenario where:
- For the first
x
calls respond withy
- Then for
x+1
respond withz
Wiremock by itself doesn't provide a direct way to to stub different responses akin to Mockito's thenReturn
or Spock's
multiple stubs. Wiremock however provides a ResponseTransformer
. I used Wiremock's ResponseTransformer
to store state, and return y
by default but return z
on x+1
try.
static class SuccessfulAtLastTransformer extends ` {
int count = 1
SuccessfulAtLastTransformer() {}
@Override
ResponseDefinition transform(
final Request request, final ResponseDefinition responseDefinition, final FileSource fileSource) {
if (request.getUrl().contains("/customer/cust1234")) {
if (count == 3) {
def responseJson = new JsonSlurper().parseText(responseDefinition.body)
// Set the customerId on the final try
responseJson.customerCar = "toyota"
def newRequestBody = JsonOutput.toJson(responseJson)
return new ResponseDefinitionBuilder()
.withStatus(200)
.withBody(newRequestBody)
.build()
}
return new ResponseDefinitionBuilder()
.withHeader("COUNT", count++ as String)
.withStatus(200)
.withBody(responseDefinition.body)
.build()
}
return responseDefinition
}
@Override
boolean applyGlobally() {
return false
}
@Override
String name() {
return "SuccessfulAtLastTransformer"
}
}
Line #1: extend import com.github.tomakehurst.wiremock.extension.ResponseTransformer
Line #8: override the transform
function.
Line #11: Check if this is the api you are interested in.
Line #12: Check if the count has reached a certain threshold and if so, then add customerCar
property to response JSON
Line #23: Add count
to the response header. That acts as our state storage. Once the count will reach x
in this case 3, then change the response (line #13).
Line #34: Set apply globally false i.e. don't use this ResponseTransformer
as an interceptor anywhere else but where I put it.
Line #40: Give your transformer a name.
Once you have defined a ResponseTransformer
like above, you can then attach it to wiremock instance like so:
@Shared
def customerServiceMock =
wireMockConfig()
.port(8090)
.extensions(SuccessfulAtLastTransformer)
Done.
Please let me know if you have any questions or if there's a better way to do the same thing in wiremock via comments on this post.