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

如何用流畅风格构建带方法存根的Mockito Mock?有无现成库?

流畅风格创建Mock:Mockito原生支持与替代方案

一、Mockito原生支持情况

Mockito本身并不支持你想要的这种链式流畅Mock构建方式。它的标准用法就是先创建Mock实例,再通过独立的when()方法设置存根逻辑,比如你最初的示例:

private Properties emptyProperties()  {
    Properties myMock = mock(Properties.class);
    when(myMock.isEmpty()).thenReturn(true);
    when(myMock.size()).thenReturn(0);
    return myMock;
}

二、实现流畅风格的可选方案

如果你想避免冗余局部变量、用链式写法处理多层嵌套Mock,有以下几种实用途径:

1. 第三方Mockito扩展库

有专门的第三方库为Mockito提供流畅API支持,比如mockito-fluent-api,它允许你直接链式调用存根设置,写法和你期望的类似:

private Properties emptyProperties() {
    return FluentMockito.mock(Properties.class)
        .when(Properties::isEmpty).thenReturn(true)
        .when(Properties::size).thenReturn(0)
        .getMock();
}

这类库本质是对Mockito的封装,完全兼容原有Mockito功能。

2. 切换到原生支持流畅API的Mock框架

比如EasyMock,它原生就支持流畅的链式Mock构建,处理嵌套Mock时也能省去局部变量:

QuestionController controller = mock(QuestionController.class);
expect(controller.getQuestions())
    .andReturn(mock(Questions.class, q -> {
        expect(q.getItems()).andReturn(Lists.newArrayList(mock(Questions.QuestionItem.class)));
    }));
replay(controller);

如果项目使用Kotlin,Mockito-Kotlin提供的DSL风格API会更简洁,完美适配链式嵌套需求。

3. 自定义封装工具类

就像你用@knittl的实现那样,自己写一个简单的FluentMock工具类,封装Mockito的创建和存根逻辑,实现链式调用:

public class FluentMock<T> {
    private final T mock;

    private FluentMock(T mock) {
        this.mock = mock;
    }

    public static <T> FluentMock<T> mock(Class<T> clazz) {
        return new FluentMock<>(Mockito.mock(clazz));
    }

    public <R> FluentMock<T> when(Function<T, R> methodCall) {
        Mockito.when(methodCall.apply(mock));
        return this;
    }

    public <R> FluentMock<T> thenReturn(R value) {
        Mockito.thenReturn(value);
        return this;
    }

    public T returnMock() {
        return mock;
    }
}

使用时就能像你编辑2里的示例那样,链式构建嵌套Mock。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:35:55