如何使用@TestConfiguration来避免src/test/java扫描?

adr*_*rhc 5 spring-boot-test

根据25.3.3。排除测试配置,此功能存在:

当放置在顶级类上时,@TestConfiguration表示 不应通过扫描拾取src/test/java中的类

我在项目的根路径/包中创建了@Configuration FilledWithBeanTestConfig和。我的包含方法的类故意注释为只是为了意外地选择; 对于这种情况Spring特别警告: @TestConfiguration DummyTestConfigsrc/test/java/com/example/mvctries/main@ComponentScanFilledWithBeanTestConfig

如果您的应用程序使用组件扫描(例如,如果您使用 @SpringBootApplication 或 @ComponentScan),您可能会发现仅为特定测试创建的顶级配置类被意外地到处拾取。

我在放置在的带注释的测试类@Import(DummyTestConfig.class)中使用了;我原以为会被忽略,但事实并非如此。搬到也没有帮助 。@WebMvcTestsrc/test/java/com/example/mvctries/controller/@Configuration FilledWithBeanTestConfigDummyTestConfigsrc/test/java/com/example/mvctries/controller/

在测试上述src/test/java扫描忽略功能的方式时,我做错了什么?
我应该如何正确使用@TestConfiguration才能使用这种src/test/java扫描忽略功能?
我如何通过@SpringBootApplication仅使用组件扫描而不是使用进行有意扫描来测试此功能@ComponentScan

虽然上述问题可能看起来太多,但它们实际上是提出以下问题的另一种方式如何制作一个项目,以清楚地证明@TestConfiguration使用情况如何导致src/test/java 中的类不应该通过扫描来获取

更新

这是示例项目:https ://github.com/adrhc/spring-boot-test-checks.git ;运行应用程序时使用端口 8083;更好地运行测试类。

Jos*_*ech 2

@ComponentScan没有filter属性将始终加载所有@Configuration类。@TestConfiguration仅适用于该一个带注释的类,不适用于整个包/目录。

这似乎是文档中的一个不幸的表述 - 它讨论了内部顶级类的使用,@TestConfiguration不是src/test/java测试的内部类的使用。

简而言之:永远不要使用@ComponentScanwithout TypeExcludeFilter- 它将开始加载所有SpringBootTest测试以及使用切片的测试的所有内容 - 这超出了首先使用切片的目的。

一旦你摆脱@ComponentScan(或一旦你添加提到的过滤器):

  • @SpringBootTest将加载所有@Configuration类,但不会加载@TestConfiguration类。@TestConfiguration需要时可以使用 来选择课程@Import
  • 像这样的测试切片@WebMvcTest不会加载任何额外的自定义类/配置,除非您使用@Import. 如果您使用@WebMvcTest(或其他切片)的所有测试都需要额外的配置,那么您可以轻松创建自己的切片或使用 META-INF/spring.factories 文件(尽管是一个单独的主题)更改现有的切片。