5.1 verify() 方法
除了创建虚拟对象之外,还经常出现另一个有趣的任务——确保被测类调用正确对象的正确方法。此外,他调用了所需的次数,使用正确的参数等。
为此,Mockito 也有一些神奇之处——方法家族Mockito.verify(…)
。指定方法调用检查的一般规则是:
Mockito.verify(an object).method name(parameter);
例子:
@ExtendWith(MockitoExtension.class)
class VerifyTest {
@Mock
List<String> mockList;
@Test
public void whenMockAnnotation() {
//method call
String name = mockList.get(10);
// check if the method was called
Mockito.verify(mockList).get(10);
}
}
在方法调用过程中,我们设置了参数为10的方法应该在对象上调用的verify()
规则。mockitoList
get()
5.2 带检查调用次数的verify()方法
有时会有更复杂的验证场景。例如,您不仅需要检查该方法被调用的事实,还需要检查它被调用了 3 次。或者它是在一个循环中被你调用的,因此应该被调用 N 次。
我们不会问这是否可以做到,我们会立即问:这样的规则怎么写下来?再一次,Mockito 没有让我们失望。规则可以指定为:
Mockito.verify(an object,quantity).method name(parameter);
重要的!数量不是类型int
,而是可以定义各种模式的特殊对象。您还记得该方法的不同版本吗any()
?这里也是一样的——有一些特殊的方法可以用来设置各种场景:
方法 | 描述 | |
---|---|---|
1个 | 绝不() | 永远不应该调用该方法 |
2个 | 次(n) | n次 |
3个 | 至少(n) | n次或更多次 |
4个 | 至少一次() | 1次以上 |
5个 | 至多(n) | n次或更少次 |
6个 | 仅有的() | 应该只有一个调用,并且只调用此方法 |
例子:
String name1 = mockList.get(1); //method call
String name2 = mockList.get(2); //method call
String name3 = mockList.get(3); //method call
//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());
您还可以要求,除了指定的方法调用之外,不对对象进行其他引用。有一个规则:
Mockito.verifyNoMoreInteractions(an object);
5.3 方法调用顺序
以前的规则没有以任何方式规定调用方法的顺序。规则必须得到满足,仅此而已。但有些情况下方法调用的顺序很重要,Mockito 对此也有解决方案。
可以使用特殊对象指定严格的方法调用顺序InOrder
。首先你需要创建它:
InOrder inOrder = Mockito.inOrder(an object);
然后通过调用方法向其添加规则verify()
。
例子:
List<String> mockedList = mock(MyList.class);
mockedList.size();
mockedList.add("a parameter");
mockedList.clear();
InOrder inOrder = Mockito.inOrder(mockedList);
inOrder.verify(mockedList).size();
inOrder.verify(mockedList).add("a parameter");
inOrder.verify(mockedList).clear();
5.4 在 Mockito 中检查异常
抛出异常这一事实的检查方式略有不同。为此,请使用方法assertThrows()
。这种检查的一般格式是:
Assertions.assertThrows(exception.class, () -> an object.methodname());
没什么复杂的。
例子:
@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//set the behavior of the method (needed for demonstration purposes only)
Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);
//check if an IllegalStateException will be thrown when calling the size method
assertThrows(IllegalStateException.class, () -> mockList.size());
}
}
GO TO FULL VERSION