1. 概述
这个Cookbook展示了如何使用Mockito来配置各种示例和用例中的行为。Cookbook的格式以例子为中心,注重实践,无需多余的详细说明和解释。如果你想要了解更多关于使用Mockito进行良好测试的知识,可以查看这里的所有Mockito文章。
我们将模拟一个简单的列表实现,这与上一个Cookbook中使用的实现相同:
public class MyList extends AbstractList<String> {
@Override
public String get(final int index) {
return null;
}
@Override
public int size() {
return 1;
}
}
2. Cookbook
为mock配置简单返回行为:
MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenReturn(false);
boolean added = listMock.add(randomAlphabetic(6));
assertThat(added).isFalse();
以另一种方式为mock配置返回行为:
MyList listMock = mock(MyList.class);
doReturn(false).when(listMock).add(anyString());
boolean added = listMock.add(randomAlphabetic(6));
assertThat(added).isFalse();
配置mock在方法调用时抛出异常:
MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenThrow(IllegalStateException.class);
assertThrows(IllegalStateException.class, () -> listMock.add(randomAlphabetic(6)));
配置具有void
返回类型的方法的行为——抛出异常:
MyList listMock = mock(MyList.class);
doThrow(NullPointerException.class).when(listMock).clear();
assertThrows(NullPointerException.class, () -> listMock.clear());
配置多次调用的行为:
MyList listMock = mock(MyList.class);
when(listMock.add(anyString()))
.thenReturn(false)
.thenThrow(IllegalStateException.class);
assertThrows(IllegalStateException.class, () -> {
listMock.add(randomAlphabetic(6));
listMock.add(randomAlphabetic(6));
});
配置spy的行为:
MyList instance = new MyList();
MyList spy = spy(instance);
doThrow(NullPointerException.class).when(spy).size();
assertThrows(NullPointerException.class, () -> spy.size());
配置mock调用实际底层方法的行为:
MyList listMock = mock(MyList.class);
when(listMock.size()).thenCallRealMethod();
assertThat(listMock).hasSize(1);
配置mock方法调用自定义Answer:
MyList listMock = mock(MyList.class);
doAnswer(invocation -> "Always the same").when(listMock).get(anyInt());
String element = listMock.get(1);
assertThat(element).isEqualTo("Always the same");
3. 总结
本指南的目标是将这些信息在线上方便获取。我已经在Google Guava、Hamcrest 和现在是Mockito上发布了几个类似的开发Cookbook。所有这些示例和代码片段的实现可以在GitHub上找到。这是一个基于Maven的项目,可以直接导入并运行。