Spring Boot测试时如何跳过第三方starter的EnvironmentPostProcessor
Spring Boot测试环境禁用第三方EnvironmentPostProcessor方案
EnvironmentPostProcessor加载时机早于自动配置类,由Spring Boot通过spring.factories机制在上下文刷新前注册执行,因此@EnableAutoConfiguration的exclude规则无法对其生效,可根据使用的Spring Boot版本选择对应方案:
方案1:使用官方原生配置排除(适用于Spring Boot 2.7.0及以上版本)
直接在测试资源目录的配置文件(如src/test/resources/application.properties)中添加配置,填入要禁用的处理器全限定类名即可,支持逗号分隔多个类:# 禁用指定EnvironmentPostProcessor spring.context.environment-post-processor.exclude=com.thirdparty.XXXEnvPostProcessor,com.thirdparty.YYYEnvPostProcessor # 也可以在这里统一配置要排除的自动配置类,无需在测试类注解上逐个声明 spring.autoconfigure.exclude=com.thirdparty.XXXAutoConfiguration,com.thirdparty.YYYAutoConfiguration该配置是Spring Boot官方提供的原生扩展点,启动时会自动过滤列表中声明的处理器,无额外代码侵入。
方案2:自定义测试上下文加载器(适用于Spring Boot 2.7.0以下版本)
低版本Spring Boot没有提供上述排除配置,可通过自定义测试上下文加载器,在初始化SpringApplication时手动过滤不需要的EnvironmentPostProcessor:- 编写自定义上下文加载器
import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.test.context.SpringBootContextLoader; import java.util.List; import java.util.stream.Collectors; public class ExcludeEnvPostProcessorLoader extends SpringBootContextLoader { // 填写所有需要禁用的EnvironmentPostProcessor全限定类名 private static final List<String> EXCLUDED_PROCESSOR_CLASS_NAMES = List.of( "com.thirdparty.XXXEnvPostProcessor", "com.thirdparty.YYYEnvPostProcessor" ); @Override protected SpringApplication getSpringApplication() { SpringApplication app = super.getSpringApplication(); // 过滤掉要排除的处理器 List<EnvironmentPostProcessor> validProcessors = app.getEnvironmentPostProcessors().stream() .filter(processor -> !EXCLUDED_PROCESSOR_CLASS_NAMES.contains(processor.getClass().getName())) .collect(Collectors.toList()); app.setEnvironmentPostProcessors(validProcessors); return app; } }- 在测试类上指定使用该加载器
@SpringBootTest @ContextConfiguration(loader = ExcludeEnvPostProcessorLoader.class) public class YourBusinessTest { // 编写测试逻辑 }
内容的提问来源于stack exchange,提问作者HKIT
相关产品推荐
相关产品推荐

