JUnit5测试时@Value注入值为null 无法读取yml配置该如何解决
问题解决方法
核心原因
你使用了Mockito的@InjectMock注解实例化ControllerClass,该注解会直接手动创建对象,不会触发Spring的属性注入逻辑,因此@Value标注的items字段无法被赋值,和yml配置本身没有直接关系。
解决方法
方案1:走Spring上下文加载(适合集成测试)
这是最常用的测试方案,会真实触发Spring的配置注入逻辑:
- 替换测试类注解:删除冗余的
@SpringJUnitConfig,把@Mock换成Spring Boot Test提供的@MockBean,删除@InjectMock改为用@Autowired注入Controller - 修正
@ActiveProfiles的语法错误,补全缺少的右双引号 - 确认
application-test.yml放在src/test/resources目录下,确保测试时可以被Spring扫描到
修改后的测试类示例:
@SpringBootTest @ActiveProfiles("test") class TestControllerClass { @Autowired ControllerClass controller; @MockBean ServiceClass service; @Test // 测试用例代码 }
方案2:纯单元测试(不启动Spring上下文,速度更快)
如果不需要加载Spring上下文只想做轻量单元测试,可以用Spring提供的反射工具类手动给字段赋值:
@ExtendWith(MockitoExtension.class) class TestControllerClass { @InjectMocks ControllerClass controller; @Mock ServiceClass service; @BeforeEach void setUp() { // 手动给items字段赋值 ReflectionTestUtils.setField(controller, "items", new String[]{"a", "b", "c", "d"}); } @Test // 测试用例代码 }
内容的提问来源于stack exchange,提问作者r-developer
相关产品推荐
相关产品推荐

