如何在单元测试中模拟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到(集成 - )测试这样的场景。特别是因为你用这个测试了整个序列化和反序列化。通过电线连接,您可以启动一个服务器,使用预定义的存根控制您的请求。

+0

man,建议使用+1模拟电路......这样可以保存我的培根,因为WebClient的流畅界面虽然很好,但完全可以尝试模拟出来。 – f1dave