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

Mockito模拟方法失效:内部调用未返回预期值

问题根因

你用mock(X.class)创建的是完全模拟对象,Mockito默认不会执行mock对象的真实方法逻辑。但你的情况里,x.b()显然跑了真实的b()方法(不然会返回int默认值0而非1),而真实方法内部调用的a()是类的原生实现,不会走你stub的x.a()逻辑——因为真实方法调用绕开了Mockito的代理层,直接调用了原始代码。

解决办法

要让b()内部调用的a()也用你stub的返回值,得用**部分模拟(Spy)**创建对象,Spy会保留真实方法的逻辑,同时允许你替换指定方法的行为:

// 基于真实X实例创建Spy对象
X x = spy(new X());
// 替换a()方法的返回值
when(x.a()).thenReturn(100);
// 此时调用x.b(),内部的a()会用stub后的结果
assertEquals(100, x.b());

也可以用doReturn语法(避免初始化时意外调用真实的a()方法):

X x = spy(new X());
doReturn(100).when(x).a();
assertEquals(100, x.b());

额外说明

  • 完全mock(mock(X.class))适合需要完全控制所有方法行为、不依赖真实类逻辑的场景。
  • Spy(spy(new X()))适合要保留大部分真实方法逻辑、仅替换个别方法的场景,刚好匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:15:25