如何将application.yaml配置值注入JUnit 5测试用例 解决@Value注入为null问题
问题原因
你当前使用的@ExtendWith(MockitoExtension.class)仅提供Mockito框架的Mock对象创建、Mock依赖注入等能力,不会加载Spring上下文,也无法识别@Value注解,更不会读取application.yaml中的配置值,所以注入的属性自然为null。同时你提供的测试代码中ownerMasterList属性缺失类型定义,也属于语法错误。
解决方案
可根据你的测试场景选择对应方案:
场景1:需要Spring容器加载真实配置(集成测试场景)
替换MockitoExtension为Spring测试扩展,使用@SpringBootTest注解启动轻量化Spring上下文,自动加载classpath下的application.yaml配置:
// JUnit 5中@SpringBootTest已经默认集成了SpringExtension,无需额外声明 @SpringBootTest public class OwnerServiceTest { @Value("${owner.master-list}") // 补充属性的实际类型,这里以List<String>为例 private List<String> ownerMasterList; @Test void findAllOwners(){ // 测试逻辑 } }
如果不需要加载全量Spring Bean,仅需要加载配置,可以使用更轻量的配置:
@ExtendWith(SpringExtension.class) // 显式指定配置文件路径,默认读取classpath下的application.yaml @TestPropertySource("classpath:application.yaml") @EnableConfigurationProperties public class OwnerServiceTest { @Value("${owner.master-list}") private List<String> ownerMasterList; @Test void findAllOwners(){ // 测试逻辑 } }
场景2:仅需单元测试,不需要启动Spring容器
直接手动赋值测试用的配置值即可,无需依赖Spring的配置注入能力,测试性能更高:
@ExtendWith(MockitoExtension.class) public class OwnerServiceTest { // 直接赋值测试用的配置值 private List<String> ownerMasterList = List.of("测试所有者1", "测试所有者2"); // 假设你要测试的OwnerService是被注入的对象 @InjectMocks private OwnerService ownerService; @BeforeEach void setUp() { // 如果配置是属于OwnerService的属性,可以用Spring提供的反射工具注入 ReflectionTestUtils.setField(ownerService, "ownerMasterList", ownerMasterList); } @Test void findAllOwners(){ // 测试逻辑 } }
内容的提问来源于stack exchange,提问作者akashdeep wadhwa
相关产品推荐
相关产品推荐

