Spring Boot 2.7测试中如何排除@ImportAutoConfiguration指定的类?
Spring Boot 2.7 中避免加载指定配置类的解决方案
问题背景
现有配置类:
@Configuration @ImportAutoConfiguration(classes = {DataSourceConfig.class }) public class AppConfig {}
测试类:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) public class SecurityIntegrationTest {}
运行测试时,@ImportAutoConfiguration引入的DataSourceConfig被执行,不符合预期导致测试失败。尝试用@ComponentScan排除该类无效,编写测试配置:
@TestConfiguration @EnableAutoConfiguration(exclude = { DataSourceConfig.class }) public class LocalTestConfiguration {}
却报错:
java.lang.IllegalStateException: The following classes could not be excluded because they are not auto-configuration classes: DataSourceConfig
解决方案
方法一:在测试类中直接排除目标配置类
@EnableAutoConfiguration(exclude)仅对Spring官方自动配置类生效,而DataSourceConfig是通过@ImportAutoConfiguration手动导入的类,因此需要换用以下方式:
排除整个
AppConfig:
如果AppConfig是被组件扫描自动加载的,直接在测试类中排除它:@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, exclude = {AppConfig.class}) public class SecurityIntegrationTest {}这样
AppConfig不会被加载,自然也不会导入DataSourceConfig。仅排除
DataSourceConfig:
创建测试配置类,用@ImportAutoConfiguration的exclude属性排除目标类,再导入到测试类中:@TestConfiguration @ImportAutoConfiguration(exclude = {DataSourceConfig.class}) public class LocalTestConfiguration {}测试类中导入该配置:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @Import(LocalTestConfiguration.class) public class SecurityIntegrationTest {}该配置会覆盖原
AppConfig中的@ImportAutoConfiguration设置,排除DataSourceConfig。
方法二:通过Profile区分环境
在生产环境的配置类上指定专属Profile,测试环境不激活该Profile,从根源避免加载:
@Configuration @ImportAutoConfiguration(classes = {DataSourceConfig.class }) @Profile("prod") public class AppConfig {}
测试类指定使用test Profile:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @ActiveProfiles("test") public class SecurityIntegrationTest {}
方法三:用Mock替代真实Bean
如果只是不想让DataSourceConfig中的真实Bean执行逻辑,可以直接在测试类中用@MockBean替换:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @MockBean(DataSourceConfig.class) public class SecurityIntegrationTest {}
Spring会自动用Mock对象替换DataSourceConfig中定义的所有Bean,避免真实逻辑运行。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

