美文网首页
Wiremock 入门教程3 - 自定义多个内部逻辑

Wiremock 入门教程3 - 自定义多个内部逻辑

作者: 这个世界是虚拟的 | 来源:发表于2020-05-13 22:55 被阅读0次

    0. 为什么需要定义多个内部逻辑

    很显然, 外部接口有多种处理逻辑, 自然我们mock时需要多种逻辑

    1. 环境搭配

    传送门 : Wiremock + Spring reactor的简单集成测试

    2. 写第一个自定义mock内部逻辑

    Wiremock 自定义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实现

    相关文章

      网友评论

          本文标题:Wiremock 入门教程3 - 自定义多个内部逻辑

          本文链接:https://www.haomeiwen.com/subject/mqjanhtx.html