1 year ago

#127808

test-img

sysons

Pact consumer test does not successfully mock the spring webclient request using the created pact

I am new to Pact Contract testing and I am trying to create a Pact consumer test to validate a method that calls an api with get request. The api request is made using Spring Webclient.

I am not able to create the webclient object by just providing the Pact mockserver eg. WebClient webClient = WebClient.builder().baseUrl(mockServer.getUrl()).build(); I am getting the exception java.lang.IllegalStateException: No suitable default ClientHttpConnector found. The explanation I get on the internet for that , is to include reactor-netty-http and I was able to get past this issue when i included that in the POM. But I don't think that is the right solution here because I need the mockserver to respond to the webclient request and it is not. Has anyone dealt with this issue before or am I doing this wrong?

Here is the code snippet:

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


    }

The webclient call:

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

spring-webclient

pact

pact-jvm

0 Answers

Your Answer

Accepted video resources