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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 15:21:02