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 GuavaHamcrest现在是Mockito上发布了几个类似的开发Cookbook。所有这些示例和代码片段的实现可以在GitHub上找到。这是一个基于Maven的项目,可以直接导入并运行。


« 上一篇: Mockito Verify用法