如何用流畅风格构建带方法存根的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
相关产品推荐
相关产品推荐

