![](/img/trans.png)
[英]Mockito inOrder.verify() fails using mock as function argument
[英]Mockito: InOrder.verify does not prohibit intermediate calls on a mock
我想測試一下,mock 上的方法是否以正確的順序調用,使用正確的參數以及與相應參數相關的正確方法調用量。
讓我們假設我想測試, List.add
被調用如下:
List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("C");
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
這個測試工作正常,但對我的意圖來說不夠嚴格。 問題是,如果實際調用發生變化,測試不一定會失敗。 例如,如果您執行以下操作:
List<String> listMock = Mockito.mock(List.class);
listMock.add("A");
listMock.add("B");
listMock.add("C");
// this won't fail
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
我想驗證add
與“A”先叫事后add
被稱為與“C”。 與此同時,根本不應該使用任何東西來調用add
。
我想出的唯一解決方案是 Mockito.verify 和 InOrder.verify 的組合:
// this works but doesn't seem very elegant
Mockito.verify(listMock, times(2)).add(Mockito.anyString());
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
inOrder.verifyNoMoreInteractions();
現在我的測試邏輯分布在 Mockito.verify 和 InOrder.verify 中。
是否有更優雅的解決方案禁止中間調用add
?
您應該在verifyNoMoreInteractions()
對象上調用verifyNoMoreInteractions()
方法以確保不再調用:
InOrder inOrder = Mockito.inOrder(listMock);
inOrder.verify(listMock).add("A");
inOrder.verify(listMock).add("C");
Mockito.verifyNoMoreInteractions(listMock);
這樣,如果在兩者之間發生另一個調用,則驗證將失敗,因為它需要 2 個調用,而您的示例調用它 3 次。 它還確保以完全期望的順序使用給定的參數進行調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.