Spring Boot JUnit测试无法加载application.yaml配置返回null如何解决
问题原因
你的代码存在以下几个核心问题,导致配置无法加载、返回值为null:
- 测试类使用了
@ExtendWith(MockitoExtension.class),这是Mockito的测试扩展,完全不会启动Spring上下文,所有Spring相关注解包括@Value、@TestProperties都不会生效,自然没法读取配置文件注入属性。 @InjectMocks只会注入你声明的@Mock模拟对象,不会处理Spring的@Value注入逻辑,MyUtilityClass里的value字段会一直是null。- 你现有代码的
getData()方法里写死了data.setValue("Example"),没有用到注入的value字段,如果是笔误想返回配置里的属性,应该改成data.setValue(value)。 @TestProperties的属性名是locations,你写的location拼写错误,就算在Spring测试上下文里也不会生效。MyUtilityClass没有添加@Component等Spring组件注解,就算启动Spring容器也不会被扫描纳入管理,@Value同样不会被处理。
修复方案
方案1:使用Spring Boot测试加载上下文(适合需要完整Spring环境的场景)
- 给
MyUtilityClass加上组件注解:
@Component public class MyUtilityClass { @Value("${value}") private String value; public DataClass getData() { var data = DataClass.builder().build(); data.setValue(value); return data; } }
- 修改测试类使用Spring测试扩展,加载上下文:
@SpringBootTest @ExtendWith(SpringExtension.class) @TestProperties(locations = "classpath:application.yaml") public class MyUtilityClassTest { @Autowired private MyUtilityClass muc; @Test void test() { var response = muc.getData(); assertEquals("EXPECTED_VALUE", response.getValue()); } }
方案2:不启动Spring上下文,手动赋值(适合轻量单元测试场景)
如果不需要启动Spring容器,可以直接给私有value字段赋值,省去启动上下文的开销:
@ExtendWith(MockitoExtension.class) public class MyUtilityClassTest { @InjectMocks private MyUtilityClass muc; @BeforeEach void setUp() throws NoSuchFieldException, IllegalAccessException { // 反射给value字段赋值 Field valueField = MyUtilityClass.class.getDeclaredField("value"); valueField.setAccessible(true); valueField.set(muc, "EXPECTED_VALUE"); } @Test void test() { var response = muc.getData(); assertEquals("EXPECTED_VALUE", response.getValue()); } }
内容的提问来源于stack exchange,提问作者Agha Salman
相关产品推荐
相关产品推荐

