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

如何让Mockito中流式接口的所有方法调用返回同一个mock实例

解决方案

你遇到的是Fluent链式调用场景下的Mock配置问题,RETURNS_DEEP_STUBS的设计目标是支持多层不同类型的嵌套调用(如a.getB().getC()),每次调用都会生成新的Mock实例,并不适配返回自身的链式接口场景,可通过自定义Answer实现统一配置,无需逐个声明方法返回规则。

方案1:自定义通用ReturnSelfAnswer(复用性最高)

首先实现一个通用的Answer类,自动识别返回类型匹配当前Mock的方法,直接返回Mock本身:

import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.mockito.Answers.RETURNS_DEFAULTS;

public class ReturnSelfAnswer implements Answer<Object> {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        // 方法返回值类型与当前Mock类型匹配时,返回Mock自身
        if (invocation.getMethod().getReturnType().isInstance(invocation.getMock())) {
            return invocation.getMock();
        }
        // 其他类型走Mockito默认返回逻辑
        return RETURNS_DEFAULTS.answer(invocation);
    }
}

使用时直接在@Mock注解中指定该Answer即可:

@Mock(answer = ReturnSelfAnswer.class)
InjectedClass injected;

配置完成后所有返回InjectedClass类型的方法都会自动返回同一个Mock实例,原有verify逻辑完全可用,无需其他调整,新增链式方法也不需要额外修改测试代码。

方案2:临时Lambda写法(无需单独定义类)

如果是单次使用不想单独定义Answer类,也可以手动创建Mock时直接用Lambda实现逻辑:

InjectedClass injected = Mockito.mock(InjectedClass.class, invocation -> {
    if (invocation.getMethod().getReturnType() == InjectedClass.class) {
        return injected;
    }
    return RETURNS_DEFAULTS.answer(invocation);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:15:03