0. 为什么需要定义多个内部逻辑
很显然, 外部接口有多种处理逻辑, 自然我们mock时需要多种逻辑
1. 环境搭配
传送门 : Wiremock + Spring reactor的简单集成测试
2. 写第一个自定义mock内部逻辑
3. 写多个自定义mock内部逻辑
我们注意到在上一篇 Wiremock 自定义mock内部逻辑 中, 我们有这一个接口
@Component
public class DummyWireMockConfigurationCustomizer implements WireMockConfigurationCustomizer {
@Override
public void customize(WireMockConfiguration config) {
config.extensions(DummyResponseTransformer.class);
}
}
这里的
config.extensions(DummyResponseTransformer.class)
实际是支持多个定义的Transformer, 那么我们只需要一个新的实现类再写入到接口实现即可
//和之前的Transformer 一样, 只是改了DUMMY_TRANSFORMER 为 "my_post_request_to_dummy_transformer"
@Slf4j
public class MyDummyResponseTransformer extends ResponseTransformer {
static final String DUMMY_TRANSFORMER = "my_post_request_to_dummy_transformer";
@Override
public Response transform(Request request, Response response, FileSource fileSource, Parameters parameters) {
String prefix = parameters.getString("prefix");
//如果被调用,将会打印这一部分日志
log.info("my_post_request_to_dummy_transformer : receive request id: {}, and prefix:{}", request.getBodyAsString(), prefix);
String newId = prefix + request.getBodyAsString();
return Response.response()
.headers(new HttpHeaders(HttpHeader.httpHeader(org.springframework.http.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)))
.status(202)
.body("{\"id\":\"" + newId + "\"}")
.build();
}
@Override
public String getName() {
return DUMMY_TRANSFORMER;
}
@Override
public boolean applyGlobally() {
return false;
}
}
修改接口
@Component
public class DummyWireMockConfigurationCustomizer implements WireMockConfigurationCustomizer {
@Override
public void customize(WireMockConfiguration config) {
config.extensions(DummyResponseTransformer.class, MyDummyResponseTransformer.class);
}
}
4. 测试
@Test
void testMyTransformer() {
stubFor(post(urlEqualTo("/change/id")).willReturn(aResponse()
.withTransformers(MyDummyResponseTransformer.DUMMY_TRANSFORMER)
.withTransformerParameter("prefix", "Hello_")));
webTestClient
.post()
.uri("/test/transform")
.bodyValue("666")
.exchange()
.expectStatus().isEqualTo(HttpStatus.OK)
.expectBody(String.class)
.consumeWith(stringEntityExchangeResult -> {
String responseBody = stringEntityExchangeResult.getResponseBody();
log.info(responseBody);
Assertions.assertEquals(responseBody, "{\"id\":\"Hello_666\"}");
});
}
运行测试, 查看日志是否打印
2020-05-13 17:46:53.521 INFO 28721 --- [qtp217930962-50] c.e.demo.MyDummyResponseTransformer : my_post_request_to_dummy_transformer : receive request id: 666, and prefix:Hello_ ...
6. 源码
https://github.com/wallisnow/wiremock_spring_reactor
5. 总结
wiremock的自定义逻辑处理较为灵活, 我们可以根据需要来定义多个mock实现
网友评论