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