如何对发出外部 WebClient 请求的 class 进行单元测试?
How to unit test a class that makes an external WebClient request?
我有一个 @Service
class 执行一些空值检查,然后使用 WebClient 调用外部微服务。 Sonar 抱怨此 class 未测试,因为该方法未经过全面测试。问题是,我如何模拟此调用或为此使用模拟服务器?我试过 WebTestClient 但我似乎无法正常工作..
public Mono<CartResponse> someServiceCall(BarRequest barRequest)
//some null checks and random logic.
return WebClient.create("http://" + fooHostName)
.post()
.uri(uri)
.body(Mono.just(barRequest), BarRequest.class)
.exchange()
.flatMap(serviceResponse -> {
if (serviceResponse.statusCode().is5xxServerError()) {
//some error logic
return Mono.just(barResponse);
}
return serviceResponse.bodyToMono(BarResponse.class);
});
所以我不想实际进行此调用,我只是希望它包含在测试中,所以我想了解如何模拟或启动模拟服务器。我已经已经在这里待了大约一天了..
目前尚不支持模拟 WebClient
,例如 RestTemplate
。
在 github 上有一个未解决的问题。
Support of MockRestServiceServer for WebClient
Spring 他们自己使用 MockWebServer 来测试他们自己的代码,所以可以肯定地说这是一个可行的解决方案。
我有一个 @Service
class 执行一些空值检查,然后使用 WebClient 调用外部微服务。 Sonar 抱怨此 class 未测试,因为该方法未经过全面测试。问题是,我如何模拟此调用或为此使用模拟服务器?我试过 WebTestClient 但我似乎无法正常工作..
public Mono<CartResponse> someServiceCall(BarRequest barRequest)
//some null checks and random logic.
return WebClient.create("http://" + fooHostName)
.post()
.uri(uri)
.body(Mono.just(barRequest), BarRequest.class)
.exchange()
.flatMap(serviceResponse -> {
if (serviceResponse.statusCode().is5xxServerError()) {
//some error logic
return Mono.just(barResponse);
}
return serviceResponse.bodyToMono(BarResponse.class);
});
所以我不想实际进行此调用,我只是希望它包含在测试中,所以我想了解如何模拟或启动模拟服务器。我已经已经在这里待了大约一天了..
目前尚不支持模拟 WebClient
,例如 RestTemplate
。
在 github 上有一个未解决的问题。
Support of MockRestServiceServer for WebClient
Spring 他们自己使用 MockWebServer 来测试他们自己的代码,所以可以肯定地说这是一个可行的解决方案。