Mockito能否验证类方法调用链中依赖类的方法调用?
问题:Mockito测试调用链时mock方法未被触发的问题
我有一个TestingThis类,其中foo()方法会调用本类的bar()方法,bar()方法则会调用注入的HelperClass类的call()方法,代码如下:
public class TestingThis { // injected another class private HelperClass helperClass; public void foo() { bar(); } public void bar() { helperClass.call(); } }
对应的测试代码如下:
@Mock private HelperClass helperClass; @InjectMocks private TestingClass testingClass; @Test public void fooTest() { testingClass.foo(); // can I have something like this? verify(helperClass).call(); verifyNoMoreInteractions(helperClass); }
我能否/是否应该验证该调用链中mock对象的方法调用?目前测试报错“Wanted but not invoked”,不符合预期,请问该如何处理?
解答
1. 能否/是否应该验证mock对象的方法调用
可以且应该:你的测试思路是合理的——通过验证依赖的HelperClass#call()是否被调用,间接确认foo()→bar()的调用链正常执行,这属于行为验证的典型场景,能有效保障业务逻辑的调用流程符合预期。
2. 解决“Wanted but not invoked”报错
报错的核心原因是测试类中注入的对象类型不匹配:你用@InjectMocks注入的是TestingClass,但实际待测试的类是TestingThis,类型不一致导致Mockito无法正确注入helperClass,最终bar()方法调用时helperClass为null,自然不会触发call()方法。
修复步骤:
- 修正对象类型:把测试类中的
TestingClass改为TestingThis@InjectMocks private TestingThis testingThis; // 与待测试类保持一致 - 确保Mockito注解生效:测试类上需添加对应注解:
- JUnit4:
@RunWith(MockitoJUnitRunner.class) - JUnit5:
@ExtendWith(MockitoExtension.class)
否则@Mock和@InjectMocks不会被Mockito初始化。
- JUnit4:
3. 可选:细粒度验证调用链(非必须)
如果需要确认bar()是否被foo()调用,可以用spy包装待测试对象,实现中间方法的验证:
@Mock private HelperClass helperClass; @InjectMocks private TestingThis testingThis; @Before public void setUp() { testingThis = spy(testingThis); } @Test public void fooTest() { testingThis.foo(); verify(testingThis).bar(); // 验证bar()被foo()调用 verify(helperClass).call(); verifyNoMoreInteractions(helperClass); }
不过这种中间方法的验证通常不是必须的,优先验证外部依赖的方法更符合单元测试“关注外部行为”的原则。
内容的提问来源于stack exchange,提问作者stacktrace2234
相关产品推荐
相关产品推荐

