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