Spring Boot测试中排除spring.factories引入的依赖
问题场景
项目B依赖父项目A,除测试外所有功能运行正常。但使用@SpringBootTest时,会自动加载A中META-INF/spring.factories里的三类配置:
org.springframework.cloud.bootstrap.BootstrapConfigurationorg.springframework.boot.autoconfigure.EnableAutoConfigurationorg.springframework.boot.env.EnvironmentPostProcessor
这些配置都关联A的包路径,导致测试时引入了不必要的A依赖。试过用@Import引入自定义配置、指定B基础包的@ComponentScan,都没解决问题,需要在B的测试用例中禁用这些A的依赖,且不影响B正常运行。
解决方案
方法1:排除A的自动配置类
针对EnableAutoConfiguration类型的配置,直接在测试类上指定排除A的自动配置类:
@SpringBootTest(excludeAutoConfiguration = {A包下的AutoConfig类1.class, A包下的AutoConfig类2.class}) public class BTest { // 测试代码 }
如果A的自动配置类数量多,也可以在测试专用的application-test.properties里配置:
spring.autoconfigure.exclude=com.a.package.AutoConfig1,com.a.package.AutoConfig2
方法2:关闭Spring Cloud Bootstrap机制
针对BootstrapConfiguration,这是Spring Cloud bootstrap阶段加载的配置,直接在测试配置里关闭即可:
在application-test.properties中添加:
spring.cloud.bootstrap.enabled=false
或者在测试类上直接指定属性:
@SpringBootTest @TestPropertySource(properties = "spring.cloud.bootstrap.enabled=false") public class BTest { // 测试代码 }
方法3:禁用A的EnvironmentPostProcessor
如果A的EnvironmentPostProcessor有开关属性,直接在application-test.properties里关闭:
# 替换成A中处理器对应的开关属性 com.a.environment.postprocessor.enabled=false
如果没有开关,可在B的测试资源目录下创建META-INF/spring.factories,只保留B需要的EnvironmentPostProcessor(或者空实现),覆盖A的配置。
方法4:手动指定测试上下文
如果上面的方法都不生效,直接手动控制测试加载的配置类,彻底隔离A的依赖:
@ContextConfiguration(classes = {B核心配置类1.class, B核心配置类2.class}) @RunWith(SpringRunner.class) public class BTest { // 测试代码 }
这种方式需要手动导入B所需的所有配置,适合测试场景简单的情况。
内容的提问来源于stack exchange,提问作者Sakshi
相关产品推荐
相关产品推荐

