Mockito无法拦截间接方法调用?如何正确实现预期返回值?
Mockito调用m2返回null问题分析与解决
问题根源
你确实对Mockito的mock机制理解有误。用mock(C2.class)创建的是完全mock对象,所有方法的原始实现都会被Mockito替换成默认逻辑:String类型方法返回null、int返回0、对象返回null等。所以调用c2.m2()时,根本不会执行你写的return this.m1()这段代码,直接返回mock的默认值null,和你stub好的m1()完全无关。
正确实现方案
方案一:用Spy保留原始方法逻辑(推荐)
Spy可以包装真实对象,仅对需要自定义的方法做stub,未stub的方法会执行原始代码逻辑。修改后的代码如下:
public class C2 { public String m1() { return "hello"; } public String m2() { return this.m1(); } public static void main(String[] args) { C2 c2 = Mockito.spy(new C2()); // 替换m1的返回值,避免触发原始方法调用 Mockito.doReturn("world").when(c2).m1(); System.out.println(c2.m2()); // 输出"world" } }
如果不在意触发一次原始m1()方法的调用,也可以写成Mockito.when(c2.m1()).thenReturn("world");,两种写法都能达到预期效果。
方案二:直接Stub m2方法
如果必须使用纯mock对象,可以直接给m2()设置stub逻辑,让它返回stub后的m1()结果:
public class C2 { public String m1() { return "hello"; } public String m2() { return this.m1(); } public static void main(String[] args) { C2 c2 = Mockito.mock(C2.class); Mockito.when(c2.m1()).thenReturn("world"); // 手动指定m2的返回逻辑 Mockito.when(c2.m2()).thenReturn(c2.m1()); System.out.println(c2.m2()); // 输出"world" } }
这种方式适合简单方法,要是m2逻辑复杂,手动模拟会很繁琐,不如Spy方案灵活。
内容的提问来源于stack exchange,提问作者zanyman
相关产品推荐
相关产品推荐

