如何在单元测试中模拟Spring WebClient
问题描述:
我们写了一个小的Spring Boot REST应用程序,它在另一个REST端点上执行一个REST请求。如何在单元测试中模拟Spring WebClient
@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可以用作端点?
答
我觉得这样做的内置的弹簧支撑仍在进行 - https://jira.spring.io/browse/SPR-15286
我真的很喜欢wiremock到(集成 - )测试这样的场景。特别是因为你用这个测试了整个序列化和反序列化。通过电线连接,您可以启动一个服务器,使用预定义的存根控制您的请求。
man,建议使用+1模拟电路......这样可以保存我的培根,因为WebClient的流畅界面虽然很好,但完全可以尝试模拟出来。 – f1dave