【问题标题】:Testing ControllerAdvice with AutoConfigureMockMvc and CompletableFuture使用 AutoConfigureMockMvc 和 CompletableFuture 测试 ControllerAdvice
【发布时间】:2019-10-03 16:45:57
【问题描述】:

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

我的控制器不会抛出异常,而是将它们包装到失败的 CompletableFutures 中并返回它们。

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

知道为什么吗?

【问题讨论】:

    标签: spring-boot spring-mvc spring-test completable-future


    【解决方案1】:

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

    在测试返回 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

    【讨论】:

      【解决方案2】:

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

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

      原因是这里没有上下文供 spring 检测控制器建议。

      【讨论】:

      • 嗯,但我没有使用构建器,mockMvc 是自动装配的(我基本上从 Spring 站点复制了示例),如果我从 Controller 中抛出异常,它就可以工作。如果异常是通过失败的 CompletableFuture 传递的,则不会。
      • 我认为您可能需要创建一个测试配置类并在其中添加注释@EnableWebMvc 以使spring import Spring MVC config
      • 但是如果在您的测试中您不需要 spring 上下文,那么我建议您改用独立设置的 MockMvc
      猜你喜欢
      • 2014-09-06
      • 2017-06-11
      • 1970-01-01
      • 2017-07-30
      • 2020-08-02
      • 2017-12-06
      • 1970-01-01
      • 2021-06-14
      • 2017-03-21
      相关资源
      最近更新 更多