mock 对象的验证行为的基本操作,也可以对行为的次数进行验证。
mock的内核不是对一个复杂对象做一个stub模拟,而是结合自己的业务逻辑,验证mock对象是不是做出了自己预期的行为
List<String> mockedList = mock(List.class);
// 对mock开始预测操作
mockedList.add("one");
mockedList.clear();
// 对之前的预测进行验证
verify(mockedList).add("one");
verify(mockedList).clear();
// 预测操作 ,同时指定行为,对mock对象指定行为
when(mockedList.get(0)).thenReturn("0");
assertEquals("0", mockedList.get(0));
// 如果预测行为的时候,不知道具体的参数,可以使用参数匹配器
when(mockedList.get(anyInt())).thenReturn("element");
assertEquals("element", mockedList.get(999));
// 如果一个行为存在多个添加次数,可以对指定的次数判断行为 , 判断重复执行的次数
mockedList.add("once");
verify(mockedList, times(1)).add("once");
verify(mockedList, never()).add("never happened");
// 可以对次数模糊确定
verify(mockedList, atLeastOnce()).add("once");
可以对 mock 对象的执行顺序一一验证
// 验证执行的顺序
List<String> singleMock = mock(List.class);
singleMock.add("was added first");
singleMock.add("was added second");
InOrder inOrder = inOrder(mockedList);
inOrder.verify(singleMock).add("was added first");
inOrder.verify(singleMock).add("was added second");
// 验证多个对象的顺序
List<String> firstMock = mock(List.class);
List<String> secondMock = mock(List.class);
firstMock.add("first add");
secondMock.add("second add");
inOrder = inOrder(firstMock, secondMock);
inOrder.verify(firstMock).add("first add");
inOrder.verify(secondMock).add("second add");
验证mock对象是不是被使用过了,或者是不是还存在没有验证过的操作
List<String> neverUsedMock = mock(List.class);
// 验证一次都没有使用
verifyZeroInteractions(neverUsedMock);
neverUsedMock.add("one");
neverUsedMock.add("two");
verify(neverUsedMock).add("one");
// 验证还存在没有验证的操作 - fail
// verifyNoMoreInteractions(neverUsedMock);
一个方法按照顺序返回结果
// 按照顺序返回,第一次 true 第二次 false
when(mockedList.add("next"))
.thenReturn(true, false);
assertTrue(mockedList.add("next"));
assertFalse(mockedList.add("next"));