我们编写了一个小型 Spring Boot REST 应用程序,它在另一个 REST 端点上执行 REST 请求。
@RequestMapping("/api/v1")
@SpringBootApplication
@RestController
@Slf4j
public class Application
{
@Autowired
private WebClient webClient;
@RequestMapping(value = "/zyx", method = POST)
@ResponseBody
XyzApiResponse zyx(@RequestBody XyzApiRequest request, @RequestHeader HttpHeaders headers)
{
webClient.post()
.uri("/api/v1/someapi")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromObject(request.getData()))
.exchange()
.subscribeOn(Schedulers.elastic())
.flatMap(response ->
response.bodyToMono(XyzServiceResponse.class).map(r ->
{
if (r != null)
{
r.setStatus(response.statusCode().value());
}
if (!response.statusCode().is2xxSuccessful())
{
throw new ProcessResponseException(
"Bad status response code " + response.statusCode() + "!");
}
return r;
}))
.subscribe(body ->
{
// Do various things
}, throwable ->
{
// This section handles request errors
});
return XyzApiResponse.OK;
}
}
我们是 Spring 的新手,在为这个小代码片段编写单元测试时遇到了麻烦。
是否有一种优雅的(反应式)方式来模拟 webClient 本身或启动 webClient 可以用作端点的模拟服务器?
原文由 Roman 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们通过提供一个自定义的
ExchangeFunction
来实现这一点,它只是将我们想要的响应返回给WebClientBuilder
:如果我们想使用 Mokcito 来验证是否进行了调用或在类中的多个单元测试中重用 WebClient,我们还可以模拟交换函数:
注意:如果您在调用
when
时遇到与发布者相关的空指针异常,您的 IDE 可能导入了Mono.when
而不是Mockito.when
资料来源: