Spring Boot中JUnit5测试@ConfigurationProperties赋值遇NPE求助
解决Spring Boot测试中StatisticsConfig导致的空指针异常(NPE)
问题原因
- 测试类中用
@Mock修饰了StatisticsConfig,导致Spring创建的是Mock对象,而非从test.properties加载配置的真实实例。 - Mock对象的所有方法默认返回
null,Service中调用statisticsConfig.getPlatforms()等方法时返回null,设置到HeroMovie对象后,断言时调用heroMovie.getPlatforms().equalsIgnoreCase()触发NPE。 - 尽管添加了
@EnableConfigurationProperties和@TestPropertySource,但@Mock优先级更高,Spring不会注入配置绑定的真实实例。
解决方案
方案一:使用真实配置绑定实例(推荐)
适合需要验证配置加载逻辑的场景,让Spring注入从test.properties读取值的真实StatisticsConfig实例:
- 替换测试类中
StatisticsConfig的@Mock注解为@Autowired:
// 去掉@Mock,改为@Autowired注入真实实例 @Autowired private StatisticsConfig statisticsConfig;
- 调整
@SpringBootTest的classes参数,确保包含配置类和被测试服务:
@SpringBootTest(classes = {RestClientHeroMovieService.class, StatisticsConfig.class})
- 保留
ReflectionTestUtils.setField逻辑覆盖test.value,或直接修改test.properties中的值。
方案二:给Mock对象设置返回值
如果仅需模拟配置值、不需要验证配置绑定逻辑,可保留@Mock,但需为Mock方法指定返回值:
在测试方法testGetHeroMovieDetails中添加Mock返回值设置:
// 在RestTemplate模拟逻辑之后添加 Mockito.when(statisticsConfig.getPlatforms()).thenReturn("WindowsTest"); Mockito.when(statisticsConfig.getBrowsers()).thenReturn("ChromeTest"); Mockito.when(statisticsConfig.getSystems()).thenReturn("MicroServicesTest");
额外优化建议
测试时建议接收Service返回的HeroMovie对象进行断言,避免逻辑混淆:
// 接收服务返回的结果 HeroMovie result = restClientHeroMovieService.getHeroMovieDetails("heroName"); // 对结果执行断言 Assertions.assertTrue( result.getHeroName().equalsIgnoreCase("test") && result.getMovies().get(0).getMovieName().equalsIgnoreCase("TestM") && result.getSomeTestValue().equalsIgnoreCase(testValue) && result.getPlatforms().equalsIgnoreCase("WindowsTest") );
内容的提问来源于stack exchange,提问作者astar
相关产品推荐
相关产品推荐

