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

Mockito测试提示入参为null,@Value注入的yml配置属性未生效是什么原因?

报错原因

  • 调用对象错误:methodX()是ClassA的成员方法,你的测试代码中错误调用了serviceB.methodX(),属于低级逻辑错误。
  • @Value注入失效:普通单元测试默认不会启动Spring上下文,也不会自动加载yml配置文件,@Value("${attr.value}")的取值逻辑不会触发,构造ClassA时attr参数会被传入null,最终调用serviceB.process(attr)时传入的就是null,和你stub预设的参数"XXX"不匹配,触发严格存根参数不匹配报错。
  • 测试用例初始化逻辑缺失:你没有手动初始化ClassA并传入测试需要的attr值,也没有添加Spring测试相关注解加载配置,导致属性没有正确赋值。

解决方案

方案1:使用Mockito做纯单元测试(不启动Spring上下文,速度快)

手动构造ClassA实例,直接传入测试用的attr值,不需要依赖Spring注入:

@ExtendWith(MockitoExtension.class)
public class ClassATest {
    // 模拟ServiceB依赖
    @Mock
    private ServiceB serviceB;

    private ClassA classA;

    @BeforeEach
    void init() {
        // 手动传入测试预设的attr值"XXX"
        classA = new ClassA(serviceB, "XXX");
    }

    @Test
    public void testMethodX() throws Exception {
        doNothing().when(serviceB).process(eq("XXX"));
        // 正确调用ClassA的methodX
        classA.methodX();
        verify(serviceB).process(eq("XXX"));
    }
}

方案2:启动Spring上下文做集成测试(会加载yml配置)

如果需要验证配置注入逻辑,可以添加Spring测试注解,加载上下文和配置:

@SpringBootTest
public class ClassAIntegrationTest {
    // 自动注入ClassA,Spring会自动从yml中读取attr.value赋值
    @Autowired
    private ClassA classA;
    // 模拟ServiceB,避免调用真实业务逻辑
    @MockBean
    private ServiceB serviceB;

    @Test
    public void testMethodX() throws Exception {
        // 此处eq的参数需要和yml中配置的attr.value值一致
        doNothing().when(serviceB).process(eq("XXX"));
        classA.methodX();
        verify(serviceB).process(eq("XXX"));
    }
}

内容的提问来源于stack exchange,提问作者jimmy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:24:04