私は、モックされたオブジェクトのメソッドを期待した順序で呼び出されるかどうかをテストしようとしています。以下は簡単な例です:
@Test
public void test() {
List<String> mockedList = Mockito.mock(List.class);
for (int i = 0; i < 5; i++) {
mockedList.add("a");
mockedList.add("b");
mockedList.add("c");
}
// I want only this to pass.
InOrder inOrder1 = Mockito.inOrder(mockedList);
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");
// I want this to fail.
InOrder inOrder2 = Mockito.inOrder(mockedList);
inOrder2.verify(mockedList).add("c");
inOrder2.verify(mockedList).add("b");
inOrder2.verify(mockedList).add("a");
}
検証順序(c -> b -> a
)は呼び出し順序(a -> b -> c
)とは異なりますが、このテストはパスします。これは、Mockito がmethod2がmethod1の後のどこかを呼び出したかどうかを検証しますが、すぐには検証しないためです(つまり、その間に他のメソッドが呼び出されていないため)。要素を複数回追加しているので、これは非常に可能です。つまり、Mockito InOrderはb -> a -> c -> a -> c -> b -> c -> b -> a ...
しかし、私はこれが失敗したいので、順序が常にあることを確認してください a -> b -> c -> a -> b -> c -> a -> b -> c ...
更新:検証する適切な方法は、同じ繰り返し数の順序を検証することです(受け入れられた回答の要約):
for (int i = 0; i < 5; i++) {
inOrder1.verify(mockedList).add("a");
inOrder1.verify(mockedList).add("b");
inOrder1.verify(mockedList).add("c");
}
// fail the test if we missed to verify any other invocations
inOrder1.verifyNoMoreInteractions();
追加する必要があることです
inOrder.verifyNoMoreInteractions();
ループを使用すると、次のような呼び出しを生成します
次にチェックするとき
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("a");
呼び出し(add(b)、add(c)、add(a))に一致します。他の呼び出しはチェックされません。
だから私はあなたがオプションを持っている必要があると思います:1)すべての呼び出しを確認しますa、b、c、a、b、c 2)モックにこれ以上の相互作用が起こらないことを確認します
ところで、検証を次のように変更した場合
inOrder.verify(mockedList).add("c");
inOrder.verify(mockedList).add("b");
inOrder.verify(mockedList).add("a");
呼び出しと一致しないため、失敗します:-)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加