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

如何调用Mock类的链式方法并解决MissingMethodInvocationException报错

异常根因

抛出org.mockito.exceptions.misusing.MissingMethodInvocationException的核心原因是Mockito默认不支持链式调用的深度Mock:mockedClass.method1()的默认返回值不是Mock对象,你直接对该返回值调用method2()不属于Mockito可拦截的Mock方法调用,因此触发异常。你之前用doReturn、spy未生效大概率是没有配合分层Mock逻辑使用。

可行解决方案
  • 方案1:开启深度Stub(RETURNS_DEEP_STUBS)

    创建Mock对象时指定深度Stub策略,Mockito会自动将链式调用的每一层返回值都封装为Mock对象,原有链式写法可直接生效:

    // 初始化Mock时开启深度Stub配置
    MockedClass mockedClass = Mockito.mock(MockedClass.class, Mockito.RETURNS_DEEP_STUBS);
    // 链式调用写法直接可用
    when(mockedClass.method1().method2()).thenReturn(x);
    

    提示:该方案适合短链式调用场景,不建议滥用,避免Mock逻辑过于隐蔽难以排查。

  • 方案2:分层显式Mock

    逐层定义每一层方法的返回值,逻辑更清晰可控,适合所有场景:

    // 先Mock第一层方法的返回值对象
    Method1ReturnClazz method1ReturnMock = Mockito.mock(Method1ReturnClazz.class);
    when(mockedClass.method1()).thenReturn(method1ReturnMock);
    // 再定义第二层方法的返回值
    when(method1ReturnMock.method2()).thenReturn(x);
    

    如果要配合doReturn使用(比如针对Spy对象、有返回值的void方法等场景),调整写法如下:

    Method1ReturnClazz method1ReturnMock = Mockito.mock(Method1ReturnClazz.class);
    doReturn(method1ReturnMock).when(mockedClass).method1();
    doReturn(x).when(method1ReturnMock).method2();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:45:03