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

Mockito中仅在特定方法调用时Mock方法的错误排查

问题分析与修复

核心错误点

1. Mock对象未注入被测类

你的ClassToBeTested在构造函数中直接new TestMethod()创建实例,测试代码里创建的TestMethod mock对象根本没被被测类使用,所有对testMethod()的调用还是走真实对象的逻辑,返回默认的false,mock规则完全没生效。

2. 调用方判断逻辑错误

你用new Object() {}.getClass().getEnclosingMethod()获取的是当前lambda表达式所在的测试方法,而不是实际调用testMethod()的evaluate1或evaluate2方法,所以条件判断永远不成立,只会返回false。

修复步骤

步骤1:改造被测类,支持依赖注入

修改ClassToBeTested,添加带参数的构造函数,允许外部传入TestMethod实例:

public class ClassToBeTested {
    private TestMethod testMethod;

    // 保留无参构造,兼容原有逻辑
    public ClassToBeTested() {
        testMethod = new TestMethod();
    }

    // 添加带参数的构造函数,用于测试注入mock
    public ClassToBeTested(TestMethod testMethod) {
        this.testMethod = testMethod;
    }

    // 其余方法保持不变...
}

步骤2:修正Mock的调用方判断逻辑

利用线程栈轨迹,找到调用testMethod()的上层方法:

@Test
public void testEvaluateSomething() throws Exception {
    // 创建mock对象
    TestMethod testMethodMock = mock(TestMethod.class);
    // 将mock注入被测类
    ClassToBeTested classToBeTested = new ClassToBeTested(testMethodMock);

    when(testMethodMock.testMethod()).thenAnswer(invocation -> {
        // 遍历栈轨迹,定位调用testMethod()的方法
        for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
            if (element.getMethodName().equals("evaluate1")) {
                return false;
            }
            if (element.getMethodName().equals("evaluate2")) {
                return true;
            }
        }
        // 默认返回false
        return false;
    });

    boolean flag = classToBeTested.evaluateSomething();
    // 验证结果:!false && true = true
    Assertions.assertTrue(flag);
}

验证结果

修复后,evaluate1调用testMethod()时返回false,evaluate2调用时返回true,最终evaluateSomething的结果为true,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:50:21