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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:25:05