5.1 Phương thức verify()

Ngoài việc tạo các đối tượng ảo, một nhiệm vụ thú vị khác thường phát sinh - để đảm bảo rằng lớp được kiểm tra gọi đúng phương thức của đúng đối tượng. Hơn nữa, anh ấy đã gọi số lần cần thiết, với các thông số chính xác, v.v.

Đối với điều này, Mockito cũng có một số phép thuật - một nhóm các phương pháp Mockito.verify(…). Quy tắc chung chỉ định kiểm tra cuộc gọi phương thức là:

Mockito.verify(an object).method name(parameter);

Ví dụ:

@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);
    }
}

Trong khi gọi phương thức, verify()chúng tôi đặt quy tắc rằng mockitoListphương thức có tham số 10 sẽ được gọi trên đối tượng get().

5.2 Phương thức verify() kiểm tra số lần gọi

Đôi khi có nhiều tình huống xác minh phức tạp hơn. Ví dụ: bạn không chỉ cần kiểm tra xem phương thức đó đã được gọi hay chưa mà còn phải kiểm tra xem nó đã được gọi 3 lần chẳng hạn. Hoặc nó được gọi từ bạn trong một chu kỳ và do đó lẽ ra phải được gọi N lần.

Chúng tôi sẽ không hỏi liệu điều này có thể được thực hiện hay không, chúng tôi sẽ hỏi ngay: làm thế nào để viết ra một quy tắc như vậy? Và một lần nữa, Mockito không làm chúng ta thất vọng. Quy tắc có thể được chỉ định là:

Mockito.verify(an object,quantity).method name(parameter);

Quan trọng! Số lượng không phải là một loại int, mà là một đối tượng đặc biệt có thể xác định các mẫu khác nhau. Bạn có nhớ các phiên bản khác nhau của phương pháp này không any()? Ở đây cũng vậy - có những phương pháp đặc biệt mà bạn có thể thiết lập các tình huống khác nhau:

Phương pháp Sự miêu tả
1 không bao giờ() Phương pháp không bao giờ nên được gọi
2 lần(n) n lần
3 ít nhất (n) n lần trở lên
4 ít nhất một lần() 1 hoặc nhiều lần
5 tối đa(n) n lần hoặc ít hơn
6 chỉ một() Chỉ nên có một cuộc gọi và chỉ với phương thức này

Ví dụ:

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());

Bạn cũng có thể yêu cầu rằng, ngoài các lời gọi phương thức được chỉ định, không có tham chiếu nào khác đến đối tượng được thực hiện . Có một quy tắc cho việc này:

Mockito.verifyNoMoreInteractions(an object);

5.3 Lệnh gọi phương thức

Các quy tắc trước đây không quy định thứ tự gọi các phương thức theo bất kỳ cách nào. Quy tắc chỉ cần được thực hiện và đó là nó. Nhưng có những tình huống khi thứ tự gọi phương thức là quan trọng và Mockito cũng có giải pháp cho vấn đề này.

Một trật tự chặt chẽ của các lệnh gọi phương thức có thể được chỉ định bằng cách sử dụng một đối tượng đặc biệt InOrder. Trước tiên, bạn cần tạo nó:

InOrder inOrder = Mockito.inOrder(an object);

Và sau đó thêm các quy tắc vào nó bằng cách gọi các phương thức verify().

Ví dụ:


    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 Kiểm tra ngoại lệ trong Mockito

Thực tế là các ngoại lệ đã được ném ra được kiểm tra hơi khác một chút. Để làm điều này, sử dụng phương pháp assertThrows(). Định dạng chung cho một kiểm tra như vậy là:

Assertions.assertThrows(exception.class, () -> an object.methodname());

Không có gì phức tạp.

Ví dụ:

@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());
    }
}