在 Java 中创建 Mockito 模拟的方法之一是
比如这样:
// this code is just a imaginary proposal
private Properties emptyProperties() {
Properties myMock = mock(Properties.class); // 1
when(myMock.isEmpty()).thenReturn(true); // 2
when(myMock.size()).thenReturn(0); // 2
return myMock;
}
我想以这样流畅的方式创建这个模拟:
private Properties emptyProperties() {
return buildMock(Properties.class) // 1
.when(myMock.isEmpty()).thenReturn(true) // 2
.when(myMock.size()).thenReturn(0) // 2
}
Mockito 本身是否有任何机制允许构建这样的模拟?或者任何其他框架可以促进这种构建方式?
我不认为避免一行有什么好处,但如果你必须这样做,这里可能是一种方法。它是 Mockito 模拟对象的薄包装,允许将配置应用于模拟对象,然后返回自身。
public class FluentMock<M> {
private final M mock;
private FluentMock(final M mock) {
this.mock = mock;
}
public static <M> FluentMock<M> mock(final Class<M> cls) {
return new FluentMock<>(Mockito.mock(cls));
}
public FluentMock<M> stub(final Consumer<? super M> stubber) {
stubber.accept(mock);
return this;
}
public M returnMock() {
return mock;
}
}
用途:
@Test
void fluent_expression() {
final DemoClass demoMock = FluentMock.mock(DemoClass.class)
.stub(mock -> when(mock.getName()).thenReturn("skynet"))
.stub(mock -> when(mock.getAge()).thenReturn(666))
.returnMock();
assertThat(demoMock.getName()).isEqualTo("skynet");
assertThat(demoMock.getAge()).isEqualTo(666);
}
@Test
void fluent_statement() {
final DemoClass demoMock = FluentMock.mock(DemoClass.class)
.stub(mock -> {
when(mock.getName()).thenReturn("skynet");
when(mock.getAge()).thenReturn(666);
})
.returnMock();
assertThat(demoMock.getName()).isEqualTo("skynet");
assertThat(demoMock.getAge()).isEqualTo(666);
}
不确定这是否是您所希望的。