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

