1

Pact コントラクト テストは初めてで、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に含めたときにこの問題を乗り越えることができました。しかし、webclient リクエストに応答するために mockserver が必要であり、そうではないため、ここでは正しい解決策ではないと思います。誰かが以前にこの問題に対処したことがありますか、それとも私はこれを間違っていますか?

コード スニペットは次のとおりです。

    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();


    }

Web クライアント呼び出し:

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

0 に答える 0