Mockito验证

时间:2020-02-23 14:40:45  来源:igfitidea点击:

Mockito Verify方法用于检查是否发生了某些行为。
我们可以在测试方法代码的末尾使用Mockito验证方法,以确保调用了指定的方法。

Mockito验证

  • Mockito verify()方法也可以用于测试方法调用的数量。
    我们可以测试模拟方法的确切次数,至少一次,至少最多一次。

  • 我们可以在所有verify()方法调用之后使用verifyNoMoreInteractions(),以确保所有内容均已通过验证。
    如果仍然有任何方法验证,它将失败并提供正确的消息。

  • verifyZeroInteractions()的行为与verifyNoMoreInteractions()方法相同。

  • 我们可以使用inOrder()方法来验证方法调用的顺序。
    我们可以跳过方法调用,但是要验证的方法必须具有相同的顺序。

Mockito verify()简单示例

@Test
void test() {
	List<String> mockList = mock(List.class);
	mockList.add("hyman");
	mockList.size();
	
	verify(mockList).add("hyman");
}

如果在模拟列表对象上仅调用一次add(" hyman")",则上述verify方法将通过。

与使用verify方法使用times(1)参数调用相同。

verify(mockList, times(1)).size();

如果我们要确保调用了一个方法,但是我们不关心该参数,则可以将ArgumentMatchers与verify方法一起使用。

verify(mockList).add(anyString());
verify(mockList).add(any(String.class));
verify(mockList).add(ArgumentMatchers.any(String.class));

请注意,org.mockito.Mockito类为Mockito框架中的大多数有用方法提供了静态方法,这有助于通过使用import static导入流畅的代码来编写它们。

Mockito验证次数

Mockito verify()方法已重载,第二个方法是verify(T模拟,VerificationMode模式)
我们可以使用它来验证调用计数。

verify(mockList, times(1)).size(); //same as normal verify method
verify(mockList, atLeastOnce()).size(); //must be called at least once
verify(mockList, atMost(2)).size(); //must be called at most 2 times
verify(mockList, atLeast(1)).size(); //must be called at least once
verify(mockList, never()).clear(); //must never be called

verifyNoMoreInteractions()

在所有验证方法之后可以使用此方法,以确保所有交互都得到验证。
如果模拟对象上存在任何未验证的交互,它将使测试失败。

//all interactions are verified, so below will pass
verifyNoMoreInteractions(mockList);
mockList.isEmpty();
//isEmpty() is not verified, so below will fail
verifyNoMoreInteractions(mockList);

第二次调用verifyNoMoreInteractions()将失败,并显示以下错误消息:

org.mockito.exceptions.verification.NoInteractionsWanted: 
No interactions wanted here:
-> at com.theitroad.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:36)
But found this interaction on mock 'list':
-> at com.theitroad.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)
***
For your reference, here is the list of all invocations ([?] - means unverified).
1. -> at com.theitroad.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:18)
2. -> at com.theitroad.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:19)
3. [?]-> at com.theitroad.mockito.verify.MockitoVerifyExamples.test(MockitoVerifyExamples.java:34)

Mockito的一大功能是异常消息,它清楚地指出了我们的测试失败的地方,因此我们可以轻松地对其进行修复。

verifyZeroInteractions()

verifyZeroInteractions()方法的行为与verifyNoMoreInteractions()方法相同。

Map mockMap = mock(Map.class);
Set mockSet = mock(Set.class);
verify(mockList).isEmpty();
verifyZeroInteractions(mockList, mockMap, mockSet);

Mockito验证仅方法调用

如果要验证仅调用了一个方法,则可以将" only()"与verify方法一起使用。

Map mockMap = mock(Map.class);
mockMap.isEmpty();
verify(mockMap, only()).isEmpty();

Mockito验证调用顺序

我们可以使用InOrder来验证调用顺序。
我们可以跳过任何方法进行验证,但是要验证的方法必须以相同的顺序调用。

InOrder inOrder = inOrder(mockList, mockMap);
inOrder.verify(mockList).add("hyman");
inOrder.verify(mockList, calls(1)).size();
inOrder.verify(mockList).isEmpty();
inOrder.verify(mockMap).isEmpty();