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

Android Studio中Mockito Spy/Mock失效:方法返回值未按预期修改

问题分析与解决方案

嘿,我一眼就瞅出问题所在啦!你虽然创建了Mock对象spyA并设置了aaa()返回10,但根本没把这个Mock对象传给B类实例——你传给B的是全新的真实A类对象AA,那B调用的肯定是真实的aaa()方法,返回1就不奇怪咯。

核心问题点

你这段代码里的关键错误:

  • 你创建了Mock对象spyA,但它和你传给B的AA是完全两个独立的对象
  • B类实例依赖的是真实的AA,自然不会用到你配置好的Mock对象

修正后的代码示例

这里给你两种正确的写法,不管用Mock还是Spy都能生效:

方式1:使用Mock对象

class A { public int aaa() { return 1; } }
class B { A classA; B(A classA) { this.classA = classA; } public int getAAA() { return classA.aaa(); } }

// 创建A的Mock对象并配置返回值
A mockA = Mockito.mock(A.class);
Mockito.when(mockA.aaa()).thenReturn(10);

// 把Mock对象传给B,而不是新的A实例
int res = new B(mockA).getAAA();
Logxx.d("RESULT: " + res); // 现在会输出RESULT: 10

方式2:使用Spy对象(如果需要保留A类的部分真实逻辑)

如果你想保留A类的其他真实方法,只修改aaa()的返回值,可以用Spy:

class A { public int aaa() { return 1; } }
class B { A classA; B(A classA) { this.classA = classA; } public int getAAA() { return classA.aaa(); } }

// 创建A的Spy对象
A spyA = Mockito.spy(new A());
// 配置Spy的aaa()方法返回10
Mockito.when(spyA.aaa()).thenReturn(10);

// 把Spy对象传给B
int res = new B(spyA).getAAA();
Logxx.d("RESULT: " + res); // 同样会输出RESULT: 10

关键提醒

使用Mockito时,一定要确保被测试类依赖的是你配置好的Mock/Spy对象,而不是全新的真实实例——不然你的Mock配置完全不会生效哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:43