ウェブサイト検索

Mockitoの検証


Mockitoのverifyメソッドは、特定の動作が発生したことを確認するために使用されます。指定されたメソッドが呼び出されたことを確認するために、テストメソッドのコードの最後でMockitoのverifyメソッドを使用することができます。

Mockitoの検証

  • Mockitoのverify()メソッドは、メソッドの呼び出し回数をテストするためにも使用できます。モックされたメソッドが呼び出された正確な回数、少なくとも1回、少なくとも、最大の呼び出し回数をテストすることができます。
  • すべてのverify()メソッド呼び出しの後にverifyNoMoreInteractions()を使用して、すべてが確認されていることを確認できます。まだ検証が残っているメソッドがある場合、それは失敗し、適切なメッセージを提供します。
  • verifyZeroInteractions() の動作は verifyNoMoreInteractions() メソッドと同じです。
  • inOrder() メソッドを使用してメソッドの呼び出し順序を確認できます。メソッドの呼び出しをスキップすることはできますが、確認されるメソッドは同じ順序でなければなりません。

いくつかの Mockito verify メソッドの例を見てみましょう。

Mockitoのverify()の簡単な例

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

上記の verify メソッドは、モックされたリストオブジェクトに対して add("Pankaj") が一度だけ呼び出される場合に通過します。これは、verify メソッドに times(1) 引数を使って呼び出すのと同じです。

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

メソッドが呼び出されることを確認したいが、引数にはこだわらない場合は、verifyメソッドと一緒にArgumentMatchersを使用できます。

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

org.mockito.MockitoクラスはMockitoフレームワークのほとんどの便利なメソッドに対して静的メソッドを提供しています。これにより、import staticを使用してそれらをインポートすることで、流暢なコードを書くのが容易になります。

Mockitoのverifyを回数とともに使用する

Mockitoのverify()メソッドはオーバーロードされており、2つ目はverify(T mock, VerificationMode mode)です。これを使用して呼び出し回数を確認できます。

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()の2回目の呼び出しは、次のエラーメッセージで失敗します:

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

Mockitoの大きな特徴の1つは、例外メッセージです。これは、テストがどこで失敗しているかを明確に示し、簡単に修正できるようにします。

verifyZeroInteractions()

verifyZeroInteractions() メソッドの動作は verifyNoMoreInteractions() メソッドと同じです。

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

Mockitoのverifyのみのメソッド呼び出し

もし私たちが唯一のメソッドが呼ばれていることを確認したいのであれば、verifyメソッドにonly()を使用することができます。

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

Mockitoの呼び出し順序の検証

InOrderを使用して、呼び出しの順序を確認できます。確認する必要のあるメソッドはスキップできますが、確認されているメソッドは同じ順序で呼び出されなければなりません。

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

要約

Mockitoのverify()メソッドは、モックオブジェクトのメソッドが呼び出されていることを確認するために使用できます。もし、メソッドの呼び出しが間違って削除された場合、verifyメソッドはエラーをスローします。

私たちのGitHubリポジトリからより多くのMockitoの例を見ることができます。

関連記事: