5.1 Kaedah pengesahan().

Selain mencipta objek maya, satu lagi tugas yang menarik sering timbul - untuk memastikan bahawa kelas yang diuji memanggil kaedah yang betul untuk objek yang betul. Lebih-lebih lagi, dia memanggil bilangan kali yang diperlukan, dengan parameter yang betul, dan sebagainya.

Untuk ini, Mockito juga mempunyai beberapa keajaiban - keluarga kaedah Mockito.verify(…). Peraturan umum yang menentukan semakan panggilan kaedah ialah:

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

Contoh:

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

Semasa panggilan kaedah, verify()kami menetapkan peraturan bahawa mockitoListkaedah dengan parameter 10 harus dipanggil pada objek get().

5.2 Kaedah pengesahan() dengan menyemak bilangan panggilan

Kadangkala terdapat senario pengesahan yang lebih kompleks. Sebagai contoh, anda perlu menyemak bukan sahaja fakta bahawa kaedah itu dipanggil, tetapi, sebagai contoh, ia dipanggil 3 kali. Atau ia dipanggil daripada anda dalam kitaran dan oleh itu sepatutnya dipanggil N kali.

Kami tidak akan bertanya sama ada ini boleh dilakukan, kami akan segera bertanya: bagaimana untuk menulis peraturan sedemikian? Dan sekali lagi, Mockito tidak mengecewakan kami. Peraturan boleh ditentukan sebagai:

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

Penting! Kuantiti bukan jenis int, tetapi objek khas yang boleh menentukan pelbagai corak. Adakah anda masih ingat versi kaedah yang berbeza any()? Ia sama di sini - terdapat kaedah khas yang anda boleh menetapkan pelbagai senario:

Kaedah Penerangan
1 tidak pernah() Kaedah itu tidak boleh dipanggil
2 kali(n) n kali
3 sekurang-kurangnya(n) n atau lebih kali
4 sekurang-kurangnya sekali() 1 kali atau lebih
5 atMost(n) n atau kurang kali
6 sahaja() Perlu ada hanya satu panggilan dan hanya kepada kaedah ini

Contoh:

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

Anda juga boleh menghendaki, selain daripada kaedah yang dinyatakan, tiada rujukan lain kepada objek dibuat . Terdapat peraturan untuk ini:

Mockito.verifyNoMoreInteractions(an object);

5.3 Pesanan panggilan kaedah

Peraturan sebelumnya tidak mengawal susunan kaedah panggilan dalam apa jua cara. Peraturan itu hanya perlu dipenuhi dan itu sahaja. Tetapi terdapat situasi apabila susunan panggilan kaedah adalah penting, dan Mockito mempunyai penyelesaian untuk ini juga.

Urutan panggilan kaedah yang ketat boleh ditentukan menggunakan objek khas InOrder. Mula-mula anda perlu menciptanya:

InOrder inOrder = Mockito.inOrder(an object);

Dan kemudian tambahkan peraturan kepadanya dengan memanggil kaedah verify().

Contoh:


    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 Menyemak pengecualian dalam Mockito

Fakta bahawa pengecualian telah dilemparkan disemak sedikit berbeza. Untuk melakukan ini, gunakan kaedah assertThrows(). Format umum untuk semakan sedemikian ialah:

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

Tiada yang rumit.

Contoh:

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