Spring测试中获取SpringApplication及解决ConfigDataContextRefresher空指针问题
解决ConfigDataContextRefresher空指针异常的方案
问题根源
ConfigDataContextRefresher内部依赖的SpringApplication实例默认不会被注册到Spring IoC容器,直接用@Autowired注入必然失败;如果手动实例化ConfigDataContextRefresher时不传入有效的SpringApplication实例,调用refresh()就会触发空指针异常。
可行解决方法
方法1:测试类中手动构建依赖实例
在测试代码里手动创建SpringApplication实例,同时注入ConfigDataContextRefresher所需的其他自动注册到容器的依赖:
@SpringBootTest(classes = YourApplication.class) class ConfigRefreshTest { private ConfigDataContextRefresher refresher; @Autowired private ConfigDataEnvironmentUpdateListener environmentUpdateListener; @Autowired private ConfigDataEnvironmentPostProcessor.BinderFactory binderFactory; @BeforeEach void initRefresher() { // 创建SpringApplication实例,传入你的主应用类 SpringApplication app = new SpringApplication(YourApplication.class); // 初始化ConfigDataContextRefresher this.refresher = new ConfigDataContextRefresher(app, environmentUpdateListener, binderFactory); } @Test void testConfigRefresh() { // 执行配置刷新 refresher.refresh(); // 验证TestConfig Bean的内容是否更新 // 示例:@Autowired private TestConfig testConfig; 然后断言属性值 } }
方法2:将SpringApplication实例注册到容器
在应用主启动类中,把创建的SpringApplication实例手动注册到IoC容器,这样测试类就能直接注入使用:
主应用类代码:
@SpringBootApplication public class YourApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(YourApplication.class); ConfigurableApplicationContext context = app.run(args); // 将SpringApplication实例以单例形式注册到容器 context.getBeanFactory().registerSingleton("springApplication", app); } }
测试类代码:
@SpringBootTest class ConfigRefreshTest { @Autowired private SpringApplication springApplication; @Autowired private ConfigDataEnvironmentUpdateListener environmentUpdateListener; @Autowired private ConfigDataEnvironmentPostProcessor.BinderFactory binderFactory; private ConfigDataContextRefresher refresher; @BeforeEach void init() { this.refresher = new ConfigDataContextRefresher(springApplication, environmentUpdateListener, binderFactory); } @Test void testRefreshFunction() { refresher.refresh(); // 验证TestConfig Bean是否正确填充 } }
方法3:使用Spring Boot自动配置的刷新机制(可选)
如果只是想验证配置刷新后TestConfig Bean的有效性,也可以直接用Spring Boot提供的@RefreshScope结合@ConfigurationProperties,无需直接操作ConfigDataContextRefresher:
- 给
TestConfig添加注解:
@ConfigurationProperties(prefix = "test") @RefreshScope @Component public class TestConfig { private String someProperty; // getter/setter }
- 测试时,调用
RefreshScope.refreshAll()方法触发刷新,然后验证TestConfig的属性变化。
内容的提问来源于stack exchange,提问作者Nikita Duginets
相关产品推荐
相关产品推荐

