Metode Mockito's Mock

1. Ikhtisar

Tutorial ini mengilustrasikan berbagai penggunaan metode tiruan statis standar dari API Mockito .

Seperti artikel lain yang berfokus pada kerangka kerja Mockito (seperti Verifikasi Mockito atau Mockito Kapan / Lalu), kelas MyList yang ditampilkan di bawah ini akan digunakan sebagai kolaborator untuk diolok-olok dalam kasus pengujian:

public class MyList extends AbstractList { @Override public String get(int index) { return null; } @Override public int size() { return 1; } }

2. Mengolok-olok Sederhana

Varian overload yang paling sederhana dari metode tiruan adalah yang memiliki satu parameter untuk kelas yang akan diejek:

public static  T mock(Class classToMock)

Kami akan menggunakan metode ini untuk mengejek kelas dan menetapkan harapan:

MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false);

Kemudian jalankan metode di tiruan:

boolean added = listMock.add(randomAlphabetic(6));

Kode berikut mengonfirmasi bahwa metode add telah dipanggil pada tiruan, dan bahwa pemanggilan mengembalikan nilai yang sesuai dengan harapan yang kita tetapkan sebelumnya:

verify(listMock).add(anyString()); assertThat(added, is(false));

3. Mengolok-olok Dengan Nama Mock

Di bagian ini, kita akan membahas varian lain dari metode tiruan yang disediakan dengan argumen yang menentukan nama tiruan:

public static  T mock(Class classToMock, String name)

Secara umum, nama tiruan tidak ada hubungannya dengan kode yang berfungsi, tetapi mungkin berguna untuk debugging, di mana nama tiruan digunakan untuk melacak kesalahan verifikasi.

Untuk memastikan bahwa nama tiruan yang diberikan disertakan dalam pesan pengecualian yang muncul dari verifikasi yang tidak berhasil, kita akan mengandalkan implementasi JUnit dari antarmuka TestRul e, yang disebut ExpectedException , dan menyertakannya dalam kelas pengujian:

@Rule public ExpectedException thrown = ExpectedException.none();

Aturan ini akan digunakan untuk menangani pengecualian yang muncul dari metode pengujian.

Dalam kode berikut, kami membuat tiruan untuk kelas MyList dan menamainya myMock :

MyList listMock = mock(MyList.class, "myMock");

Setelah itu, tetapkan ekspektasi pada metode tiruan dan jalankan:

when(listMock.add(anyString())).thenReturn(false); listMock.add(randomAlphabetic(6));

Kami akan membuat verifikasi yang sengaja gagal yang seharusnya memunculkan pengecualian dengan pesan yang berisi informasi tentang tiruan tersebut. Untuk melakukannya, ekspektasi tentang pengecualian perlu ditetapkan terlebih dahulu:

thrown.expect(TooLittleActualInvocations.class); thrown.expectMessage(containsString("myMock.add"));

Verifikasi berikut akan gagal dan memunculkan pengecualian yang cocok dengan yang diharapkan:

verify(listMock, times(2)).add(anyString());

Berikut adalah pesan pengecualian yang ditampilkan:

org.mockito.exceptions.verification.TooLittleActualInvocations: myMock.add(); Wanted 2 times: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...) but was 1 time: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)

Seperti yang bisa kita lihat, nama tiruan telah disertakan dalam pesan pengecualian, yang akan berguna untuk menemukan titik kegagalan jika verifikasi tidak berhasil.

4. Mengejek Dengan Jawaban

Di sini, kami akan mendemonstrasikan penggunaan varian tiruan di mana strategi untuk jawaban tiruan untuk interaksi dikonfigurasikan pada waktu pembuatan. Ini mock metode tanda tangan di dokumentasi penampilan Mockito seperti berikut:

public static  T mock(Class classToMock, Answer defaultAnswer)

Mari kita mulai dengan definisi implementasi antarmuka Answer :

class CustomAnswer implements Answer { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { return false; } }

Kelas CustomAnswer di atas digunakan untuk pembuatan tiruan:

MyList listMock = mock(MyList.class, new CustomAnswer());

Jika kita tidak menetapkan ekspektasi pada suatu metode, jawaban default, yang dikonfigurasi oleh tipe CustomAnswer , akan ikut bermain. Untuk membuktikannya, kita akan melewati langkah pengaturan ekspektasi dan melompat ke eksekusi metode:

boolean added = listMock.add(randomAlphabetic(6));

Verifikasi dan pernyataan berikut mengonfirmasi bahwa metode tiruan dengan argumen Jawaban telah berfungsi seperti yang diharapkan:

verify(listMock).add(anyString()); assertThat(added, is(false));

5. Mengejek Dengan MockSettings

Metode tiruan terakhir yang tercakup dalam artikel ini adalah varian dengan parameter jenis MockSettings . Metode kelebihan beban ini digunakan untuk menyediakan tiruan non-standar.

Ada beberapa pengaturan khusus yang didukung oleh metode antarmuka MockSettings , seperti mendaftarkan pendengar untuk pemanggilan metode pada tiruan saat ini dengan invocationListeners , mengkonfigurasi serialisasi dengan serializable , menentukan contoh untuk memata-matai dengan spiedInstance , mengkonfigurasi Mockito untuk mencoba menggunakan konstruktor saat membuat contoh tiruan dengan useConstructor , dan beberapa lainnya.

Demi kenyamanan, kami akan menggunakan kembali kelas CustomAnswer yang diperkenalkan di bagian sebelumnya untuk membuat implementasi MockSettings yang mendefinisikan jawaban default.

Sebuah MockSettings objek yang dipakai oleh metode pabrik sebagai berikut:

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

Objek pengaturan itu akan digunakan dalam pembuatan tiruan baru:

MyList listMock = mock(MyList.class, customSettings);

Mirip dengan bagian sebelumnya, kami akan memanggil metode add dari instance MyList dan memverifikasi bahwa metode tiruan dengan argumen MockSettings berfungsi sebagaimana mestinya dengan menggunakan cuplikan kode berikut:

boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); assertThat(added, is(false));

6. Kesimpulan

Tutorial ini telah membahas metode tiruan Mockito secara rinci. Penerapan contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub.