如何让SpringBootTest注册ApplicationEnvironmentPreparedListener以成功测试?
解决Spring Boot Test中自定义EventListener未注册的问题
针对你遇到的@SpringBootTest启动时未加载自定义ApplicationEnvironmentPreparedEvent监听器导致的上下文初始化失败问题,有几个直接可行的方案:
方案一:通过测试配置参数指定监听器
直接在@SpringBootTest注解中添加spring.main.listeners配置,强制测试启动时加载你的自定义监听器:
@SpringBootTest(properties = {"spring.main.listeners=com.yourpackage.YourCustomEnvironmentListener"}) @AutoConfigureMockMvc public class YourMockMvcTest { // 测试代码 }
这种方式不需要修改原有监听器的代码,直接通过测试配置注入,和正常启动时通过SpringApplicationBuilder添加监听器的效果一致。
方案二:将监听器注册为自动配置类
如果希望所有测试都自动加载这个监听器,可以把监听器的注册逻辑放到自动配置类中:
@Configuration public class ListenerAutoConfiguration { @Bean public ApplicationListener<ApplicationEnvironmentPreparedEvent> customEnvironmentListener() { return new YourCustomEnvironmentListener(); } }
然后在src/test/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加这个配置类的全类名,这样所有@SpringBootTest启动时都会自动加载该监听器。
方案三:自定义SpringApplication启动逻辑
通过@SpringBootTest的applicationFactory属性指定自定义的SpringApplication工厂类,模拟main方法中的启动逻辑:
public class CustomSpringApplicationFactory implements SpringApplicationFactory { @Override public SpringApplication create(Class<?>... sources) { SpringApplication application = new SpringApplication(sources); application.addListeners(new YourCustomEnvironmentListener()); return application; } }
然后在测试类中指定:
@SpringBootTest(applicationFactory = CustomSpringApplicationFactory.class) @AutoConfigureMockMvc public class YourMockMvcTest { // 测试代码 }
注意:ApplicationEnvironmentPreparedEvent属于SpringApplication启动早期的事件,不能通过普通的@Component注解注册(此时上下文还未初始化,无法扫描到Bean),必须通过上述SpringApplication层面的配置方式加载。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

