使用 AutoConfigureMockMvc 和 CompletableFuture 测试 ControllerAdvice

Testing ControllerAdvice with AutoConfigureMockMvc and CompletableFuture

我已经添加了一个 REST 控制器 returning CompletableFutures 到一个项目,使用 ControllerAdvice 将异常转换为错误 DTO。

我的控制器不会抛出异常,将它们包装到失败的 CompletableFutures 中并 returning 这些。

当 运行 完整的应用程序和手动测试按预期工作时,但在我的测试中,mockMvc 不会触发建议并且始终 return HTTP 2xx。

知道为什么吗?

如果您有 MockMvc 的独立设置,则需要在创建 mockMvc 实例时指定要使用的控制器建议(如果有的话),如下所示:

MockMvc mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setControllerAdvice(new YourControllerAdvice())
            .build();

这是因为您没有此处的上下文 spring 来检测控制器建议。

我发现我的测试不正确(或者,换句话说..测试框架的设计不符合我的预期;)

当测试返回 CompletableFutures 的控制器时,需要使用 asyncDyspatch,如

https://github.com/spring-projects/spring-framework/blob/master/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/AsyncTests.java