5.1 verify() 方法
除了創建虛擬對象之外,還經常出現另一個有趣的任務——確保被測類調用正確對象的正確方法。此外,他調用了所需的次數,使用正確的參數等。
為此,Mockito 也有一些神奇之處——方法家族Mockito.verify(…)
。指定方法調用檢查的一般規則是:
Mockito.verify(an object).method name(parameter);
例子:
@ExtendWith(MockitoExtension.class)
class VerifyTest {
@Mock
List<String> mockList;
@Test
public void whenMockAnnotation() {
//method call
String name = mockList.get(10);
// check if the method was called
Mockito.verify(mockList).get(10);
}
}
在方法調用過程中,我們設置了參數為10的方法應該在對像上調用的verify()
規則。mockitoList
get()
5.2 帶檢查調用次數的verify()方法
有時會有更複雜的驗證場景。例如,您不僅需要檢查該方法被調用的事實,還需要檢查它被調用了 3 次。或者它是在一個循環中被你調用的,因此應該被調用 N 次。
我們不會問這是否可以做到,我們會立即問:這樣的規則怎麼寫下來?再一次,Mockito 沒有讓我們失望。規則可以指定為:
Mockito.verify(an object,quantity).method name(parameter);
重要的!數量不是類型int
,而是可以定義各種模式的特殊對象。您還記得該方法的不同版本嗎any()
?這裡也是一樣的——有一些特殊的方法可以用來設置各種場景:
方法 | 描述 | |
---|---|---|
1個 | 絕不() | 永遠不應該調用該方法 |
2個 | 次(n) | n次 |
3個 | 至少(n) | n次或更多次 |
4個 | 至少一次() | 1次以上 |
5個 | 至多(n) | n次或更少次 |
6個 | 僅有的() | 應該只有一個調用,並且只調用此方法 |
例子:
String name1 = mockList.get(1); //method call
String name2 = mockList.get(2); //method call
String name3 = mockList.get(3); //method call
//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());
您還可以要求,除了指定的方法調用之外,不對對象進行其他引用。有一個規則:
Mockito.verifyNoMoreInteractions(an object);
5.3 方法調用順序
以前的規則沒有以任何方式規定調用方法的順序。規則必須得到滿足,僅此而已。但有些情況下方法調用的順序很重要,Mockito 對此也有解決方案。
可以使用特殊對象指定嚴格的方法調用順序InOrder
。首先你需要創建它:
InOrder inOrder = Mockito.inOrder(an object);
然後通過調用方法向其添加規則verify()
。
例子:
List<String> mockedList = mock(MyList.class);
mockedList.size();
mockedList.add("a parameter");
mockedList.clear();
InOrder inOrder = Mockito.inOrder(mockedList);
inOrder.verify(mockedList).size();
inOrder.verify(mockedList).add("a parameter");
inOrder.verify(mockedList).clear();
5.4 在 Mockito 中檢查異常
拋出異常這一事實的檢查方式略有不同。為此,請使用方法assertThrows()
。這種檢查的一般格式是:
Assertions.assertThrows(exception.class, () -> an object.methodname());
沒什麼複雜的。
例子:
@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//set the behavior of the method (needed for demonstration purposes only)
Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);
//check if an IllegalStateException will be thrown when calling the size method
assertThrows(IllegalStateException.class, () -> mockList.size());
}
}
GO TO FULL VERSION