如何使用Mockito屏蔽methodA1()方法的执行?
实现方案(基于Java常用Mockito测试框架)
首先明确:如果直接全量mockmethodA(),会直接跳过整个methodA的所有内部逻辑,不符合你只跳过methodA1()的需求,所以需要用**部分mock(Spy)**的方案,两种常用实现方式如下:
方案1:对被测类使用Spy,单独mock methodA1()
这种方式逻辑最简洁,不会影响methodA()本身其他逻辑的执行:
// 1. 初始化被测类的Spy对象,不要使用普通Mock对象 // Spring环境下可直接使用@Spy注解注入 YourTestClass spyObj = Mockito.spy(new YourTestClass()); // 2. 单独mock methodA1(),设置为无操作 Mockito.doNothing().when(spyObj).methodA1(); // 3. 执行测试方法即可 spyObj.methodToTest();
执行后调用链路符合预期:methodToTest() -> 正常执行methodA() -> 跳过methodA1() -> 正常执行methodA2()、methodA3() -> 正常执行methodB()。
方案2:重写methodA()的mock逻辑,手动保留需要执行的方法
如果你的场景确实需要先mock掉整个methodA(),可以在自定义Answer里手动调用要保留的方法:
YourTestClass mockObj = Mockito.mock(YourTestClass.class); // 保留methodB的原始执行逻辑 Mockito.doCallRealMethod().when(mockObj).methodB(); // 自定义methodA的执行逻辑,剔除methodA1的调用 Mockito.doAnswer(invocation -> { YourTestClass obj = (YourTestClass) invocation.getMock(); // 仅调用需要保留的方法,不调用methodA1 obj.methodA2(); obj.methodA3(); return null; }).when(mockObj).methodA(); mockObj.methodToTest();
注意:方案2仅适用于不能直接Spy
methodA1()的特殊场景,优先推荐方案1,出错概率更低。
其他测试框架通用思路
如果使用PowerMock、TestNG对应mock工具等其他框架,核心逻辑完全一致:
- 不要全量mock
methodA() - 要么对
methodA1()单独做无返回mock,要么自定义methodA()的执行逻辑,剔除methodA1()的调用 - 如果
methodA1()是私有方法,普通Mockito不支持mock私有方法,需要引入PowerMock,仅需替换mock私有方法的对应API即可,整体思路不变
内容的提问来源于stack exchange,提问作者WKWW
相关产品推荐
相关产品推荐

