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

时间:2019-05-15 19:30:20

标签: spring-boot-test

根据25.3.3. Excluding Test Configuration,此功能存在:

  

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

我在项目的根路径/包@Configuration FilledWithBeanTestConfig中创建了@TestConfiguration DummyTestConfigsrc/test/java/com/example/mvctries/。我的main包含方法的类是故意 并用@ComponentScan注释,只是为了不小心选择FilledWithBeanTestConfig;关于这种情况,Spring特别警告:

  

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

我在@Import(DummyTestConfig.class)中放置的@WebMvcTest带注释的测试类中使用了src/test/java/com/example/mvctries/controller/;我期望@Configuration FilledWithBeanTestConfig被忽略,但事实并非如此。将DummyTestConfig移至src/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;更好地运行测试类。

2 个答案:

答案 0 :(得分:0)

不具有@ComponentScan属性的

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

在文档中似乎是一个不幸的表述-它讨论了@TestConfiguration内部而不是the inner class of you test顶级类src/test/java的用法。

简而言之:切勿在没有@ComponentScan的情况下使用TypeExcludeFilter-它会开始为您的所有SpringBootTest测试以及使用切片的测试加载所有内容-这超出了在第一名。

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

  • @SpringBootTest将加载所有@Configuration类,但不会加载@TestConfiguration类。可以在需要时使用@TestConfiguration选择@Import个类。
  • @WebMvcTest这样的测试片将不会加载任何额外的自定义类/配置,除非您使用@Import进行指示。如果使用@WebMvcTest(或其他分片)进行的所有测试都需要其他配置,则可以轻松创建自己的分片(不过是一个单独的主题)。

答案 1 :(得分:0)

当应用QUERY时,则需要添加@ComponentScan以避免意外拾取excludeFilters

@TestConfiguration

参考:看@ComponentScan(value = { "my.base.package" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public class BootTestConfig { } ;它在 @SpringBootApplication 上定义了 excludeFilters