根据25.3.3. Excluding Test Configuration,此功能存在:
当放在顶级类上时,@ TestConfiguration指示 不应通过扫描获取src / test / java中的类
我在项目的根路径/包@Configuration FilledWithBeanTestConfig
中创建了@TestConfiguration DummyTestConfig
和src/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;更好地运行测试类。
答案 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
。