【问题标题】:In Spring Boot, how do I enable a @ControllerAdvice from a starter during a @WebMvcTest在 Spring Boot 中,如何在 @WebMvcTest 期间从启动器启用 @ControllerAdvice
【发布时间】:2021-08-13 06:53:23
【问题描述】:

我创建了一个用@ControllerAdvice@ResponseBody 注释的类MyExceptionHandler 来处理异常,因为这是Spring Boot 中的常见做法。

现在我将这个类移到一个初学者中,我包含在几个项目中,所以它们都使用相同的基本异常处理。当我正常启动 Spring Boot 应用程序时,这工作正常。

当我执行一个带有注释的测试时:

@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@WebMvcTest(controllers = SomeController.class)

启动器中的 ControllerAdvice 未激活,因此我无法测试我的错误响应。

当我在我的项目中创建MyExceptionHandler 的子类并使用@ControllerAdvice@ResponseBody 注释该类时,一切正常。

我如何确保在我的测试期间,启动器中的 ControllerAdvice 被激活?

【问题讨论】:

  • 你可以试试这个@Import(YourControllerAdvice.class)
  • 是的。 @Import 有效。我真正不喜欢的是,我必须在每个测试中添加一些东西才能使其正常工作。一个通用的解决方案会更好。

标签: java spring spring-boot


【解决方案1】:

我找到了更好的方法。 Spring 明确支持 AutoConfigureWebMvc 的自动配置。 您可以向 /META-INF/spring.factories 添加密钥:

org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc=...

另请参阅此答案: https://stackoverflow.com/a/60247057/2936509

【讨论】:

    【解决方案2】:
    @WebMvcTest(controllers = SomeController.class)
    

    这一行告诉测试具体使用什么。其他控制器不会添加到上下文中。 @ControllerAdvice@Component,因此它也可能不会添加到上下文中。

    您应该删除此规范,或者添加您要测试的@ControllerAdvice 类。

    docs 在“控制器”价值和“价值”价值部分谈到了这一点。

    【讨论】:

    • 感谢指点!在 @WebMvcTest 中将建议添加为另一个“控制器”不起作用。有趣的是,当 ControllerAdvice 在项目本身中时,它会被使用。只有当它来自 spring-boot-starter 时,它才不会被使用。
    • 我发现的文档通常还指出,当使用 @WebMvcTest 时,会自动添加 ControllerAdvices。例如“默认情况下,仅包含 @Controller(未定义显式控制器时)、@ControllerAdvice 和 WebMvcConfigurer bean。”
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2016-07-26
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多