Spring单元测试抛出this.applicationContext is null异常如何解决
问题背景
团队Spring技术专家离职后接手项目,已熟练掌握Java、了解Spring基础原理但缺乏框架深度使用经验,迭代过程中单元测试抛出阻塞性异常:Cannot invoke "org.springframework.context.ApplicationContext.getBean(java.lang.Class)" because "this.applicationContext is null"
触发异常的测试代码:
@Test public void testAnalyzeMetadata() throws DataException, IOException, BadJSONException { new IRWMetadataAnalyzer().analyzeMetadata( 10, "no file"); }
测试类注解配置与其他可正常运行的测试类完全一致,配置如下:
@ActiveProfiles("test") @DataJdbcTest @AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE) @Commit @ComponentScan(basePackages = {"org.ms.IRWMetadataIntegration"})
已确认项目中无ApplicationContext显式初始化逻辑,初始化由Spring底层自动完成,无法定位当前场景下上下文未注入的原因。
根因定位
你手动new了IRWMetadataAnalyzer实例,这个对象不归Spring容器管理,其内部依赖的applicationContext属性自然不会被Spring注入,调用时必然报空指针。其他正常运行的测试用例,无一例外都是通过Spring依赖注入获取托管Bean,不会手动实例化Spring管理的组件。
排查步骤
- 对比同项目下正常运行的测试用例,确认被测类实例的获取方式,不要手动new被Spring托管的组件
- 检查
IRWMetadataAnalyzer类定义:确认类上是否标注@Component/@Service等Spring托管注解,类所在包是否在@ComponentScan配置的扫描路径org.ms.IRWMetadataIntegration下 - 检查
IRWMetadataAnalyzer内部的ApplicationContext获取逻辑:确认applicationContext字段是否加了@Autowired注解,或者类是否正确实现了ApplicationContextAware接口、重写了setApplicationContext方法 - 检查测试注解适配性:
@DataJdbcTest是Spring Boot的切片测试注解,默认只会加载JDBC层相关的Bean,如果你要测试的类属于Service层等非JDBC层组件,默认不会被加载到测试上下文里
修复方案
- 修改测试类代码,通过依赖注入获取
IRWMetadataAnalyzer实例,禁止手动new:
// 测试类内注入被测Bean @Autowired private IRWMetadataAnalyzer irwMetadataAnalyzer; @Test public void testAnalyzeMetadata() throws DataException, IOException, BadJSONException { irwMetadataAnalyzer.analyzeMetadata(10, "no file"); }
- 如果注入时提示找不到对应Bean,根据场景选择修复方式:
- 如果
IRWMetadataAnalyzer没有加Spring组件注解,在类上添加@Component注解,确保类在扫描包路径下 - 如果是
@DataJdbcTest切片扫描不到对应Bean,在测试类上加@Import(IRWMetadataAnalyzer.class)手动导入该类,或者将测试注解替换为@SpringBootTest加载完整的Spring应用上下文
- 如果
- 如果是
ApplicationContextAware实现逻辑问题,确认setApplicationContext方法没有被final修饰、没有被自定义AOP拦截导致赋值逻辑失效
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

