Kaedah Mockito's Mock

1. Gambaran keseluruhan

Tutorial ini menggambarkan pelbagai penggunaan kaedah mock statik standard dari Mockito API.

Seperti artikel lain yang difokuskan pada kerangka Mockito (seperti Mockito Verify atau Mockito When / Then), kelas MyList yang ditunjukkan di bawah akan digunakan sebagai kolaborator untuk diejek dalam kes ujian:

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

2. Mengejek Sederhana

Varian kaedah olok - olok termudah yang paling mudah adalah kaedah dengan parameter tunggal untuk kelas yang dipermainkan:

public static  T mock(Class classToMock)

Kami akan menggunakan kaedah ini untuk mengejek kelas dan menetapkan jangkaan:

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

Kemudian jalankan kaedah pada mock:

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

Kod berikut mengesahkan bahawa kaedah penambahan telah digunakan pada tiruan, dan bahawa permintaan mengembalikan nilai yang sesuai dengan jangkaan yang kita tetapkan sebelumnya:

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

3. Mengejek Dengan Nama Mengejek

Di bahagian ini, kami akan membahas varian lain dari kaedah tiruan yang dilengkapi dengan argumen yang menentukan nama tiruan:

public static  T mock(Class classToMock, String name)

Secara umum, nama tiruan tidak ada kaitan dengan kod kerja, tetapi mungkin berguna ketika melakukan debug, di mana nama tiruan digunakan untuk melacak kesalahan pengesahan.

Untuk memastikan bahawa nama tiruan yang disediakan disertakan dalam mesej pengecualian yang dilemparkan dari pengesahan yang tidak berjaya, kami akan bergantung pada pelaksanaan JUnit antara muka TestRul e, yang disebut ExpectedException , dan memasukkannya ke dalam kelas ujian:

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

Peraturan ini akan digunakan untuk menangani pengecualian yang dilemparkan dari kaedah ujian.

Dalam kod berikut, kami membuat tiruan untuk kelas MyList dan menamakannya myMock :

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

Selepas itu, tetapkan jangkaan pada kaedah ejekan dan jalankan:

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

Kami akan membuat pengesahan yang sengaja disengajakan yang harus membuat pengecualian dengan mesej yang mengandungi maklumat mengenai ejekan. Untuk melakukannya, jangkaan pengecualian harus ditetapkan terlebih dahulu:

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

Pengesahan berikut akan gagal dan membuang pengecualian yang sesuai dengan yang diharapkan:

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

Inilah mesej pengecualian yang dilemparkan:

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 kita lihat, nama tiruan telah disertakan dalam pesan pengecualian, yang akan berguna untuk mencari titik kegagalan sekiranya berlaku pengesahan yang tidak berjaya.

4. Mengejek Dengan Jawapan

Di sini, kami akan menunjukkan penggunaan varian tiruan di mana strategi untuk jawapan tiruan terhadap interaksi dikonfigurasi pada waktu penciptaan. Ini olok-olok tanda tangan method dalam kelihatan dokumentasi Mockito seperti berikut:

public static  T mock(Class classToMock, Answer defaultAnswer)

Mari kita mulakan dengan definisi pelaksanaan antara muka Jawapan :

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

The CustomAnswer kelas di atas digunakan bagi penjanaan olok-olok yang:

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

Sekiranya kita tidak menetapkan harapan pada suatu metode, jawaban lalai, yang dikonfigurasi oleh jenis CustomAnswer , akan dimainkan. Untuk membuktikannya, kami akan melangkau langkah penetapan jangkaan dan melompat ke pelaksanaan kaedah:

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

Pengesahan dan penegasan berikut mengesahkan bahawa kaedah tiruan dengan argumen Jawapan telah berfungsi seperti yang diharapkan:

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

5. Mengejek Dengan MockSettings

Kaedah tiruan terakhir yang dibahas dalam artikel ini adalah varian dengan parameter jenis MockSettings . Kaedah yang terlalu banyak ini digunakan untuk memberikan tiruan yang tidak standard.

Terdapat beberapa tetapan tersuai yang disokong oleh kaedah antara muka MockSettings , seperti mendaftarkan pendengar untuk pemanggilan kaedah pada tiruan semasa dengan pemanggil Pendengar , mengkonfigurasi serialisasi dengan serializable , menentukan contoh untuk mengintip dengan spiedInstance , mengkonfigurasi Mockito untuk cuba menggunakan konstruktor semasa membuat ejekan dengan penggunaanConstructor , dan beberapa yang lain.

Untuk kemudahan, kami akan menggunakan semula kelas CustomAnswer yang diperkenalkan di bahagian sebelumnya untuk membuat pelaksanaan MockSettings yang menentukan jawapan lalai.

A MockSettings objek instantiated dengan kaedah kilang seperti berikut:

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

Objek tetapan itu akan digunakan dalam pembuatan tiruan baru:

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

Sama dengan bahagian yang lalu, kita akan memanggil add kaedah yang MyList contoh dan mengesahkan bahawa mock kaedah dengan MockSettings hujah berfungsi kerana ia bertujuan untuk dengan menggunakan coretan kod berikut:

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

6. Kesimpulannya

Tutorial ini telah merangkumi kaedah olok - olok Mockito secara terperinci. Pelaksanaan contoh dan coretan kod ini terdapat dalam projek GitHub.