1

我是 Pact Contract 测试的新手,我正在尝试创建一个 Pact 消费者测试来验证一个使用 get 请求调用 api 的方法。api 请求是使用 Spring Webclient 发出的。

我无法通过仅提供 Pact 模拟服务器来创建 webclient 对象,例如。 WebClient webClient = WebClient.builder().baseUrl(mockServer.getUrl()).build(); 我得到了例外java.lang.IllegalStateException: No suitable default ClientHttpConnector found。我在互联网上得到的解释是包括reactor-netty-http在内,当我将它包含在 POM 中时,我能够解决这个问题。但我认为这不是正确的解决方案,因为我需要 mockserver 来响应 webclient 请求,但事实并非如此。以前有没有人处理过这个问题,还是我做错了?

这是代码片段:

    public RequestResponsePact pactMethod(PactDslWithProvider builder) {
        Map<String, String> headers = new HashMap<>();
        headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);

        return builder.given("Consumer request")
                .uponReceiving(" getResource call")
                .path("/path")
                .method("GET")
                .willRespondWith()
                .status(200)
                .headers(headers)
                .body(RESPONSE_JSON).toPact();
    }


    @Test
    @PactTestFor(pactMethod = "pactMethod", port = "9999")
    public void consumerTest(MockServer mockServer) {
        WebClient webClient = WebClient.builder().baseUrl(mockServer.getUrl()).build();
        ConsumerServiceClient consumerServiceClient =  new ConsumerServiceClient(webClient);

        Mono<Data> data = consumerServiceClient.getData();

        StepVerifier.create(data)
                .assertNext(resp -> {
                    try {
                        Value value = resp.getValue();
                        Assertions.assertFalse( value.isEmpty());
                    } catch (Exception e) {
                        log.error("Unable to convert response to Value", e);
                        Assertions.fail();
                    }
                }).expectComplete()
                .verify();


    }

网络客户端调用:

webClient.get()
                .uri("/path")
                .retrieve()
                .onStatus(status -> status == HttpStatus.NOT_FOUND,
                        res -> Mono.error(new RunTimeException()))
                .bodyToMono(clazz);
4

0 回答 0