You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例:

  1. 替换测试类中StatisticsConfig的@Mock注解为@Autowired:
// 去掉@Mock,改为@Autowired注入真实实例
@Autowired
private StatisticsConfig statisticsConfig;
  1. 调整@SpringBootTest的classes参数,确保包含配置类和被测试服务:
@SpringBootTest(classes = {RestClientHeroMovieService.class, StatisticsConfig.class})
  1. 保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:10:25