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
相关产品推荐
相关产品推荐

