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

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初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:15