CodeGym/Java Course/Module 3 a ɛto so abien/揭示對象的特定行為

揭示對象的特定行為

開放

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()規則。mockitoListget()

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());
    }
}
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言