簡體   English   中英

Mockito:InOrder.verify 不禁止對模擬進行中間調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM