4.1 Parameter kaedah
Peraturan sebelumnya yang ditambahkan pada objek olok-olok ditangani dengan kaedah tanpa parameter. Dan bagaimana untuk membuat peraturan untuk kaedah dengan parameter? Lebih-lebih lagi, saya ingin membuat peraturan supaya untuk beberapa nilai parameter terdapat satu hasil, dan untuk yang lain - yang lain.
Begitulah cara anda juga boleh melakukannya. Jika anda mahu kaedah mengembalikan sesuatu yang khusus dengan parameter tertentu, maka peraturan boleh ditulis seperti ini:
Mockito.doReturn(result).when(an object).method name(parameter);
Mari kita lihat contoh untuk memahami dengan lebih baik. Biarkan Senarai kami mengembalikan nama Ivan apabila meminta elemen ke-10, dan nama Marya apabila meminta elemen ke-500. Tidak lebih awal berkata daripada selesai.
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 Templat parameter
Dan dengan serta-merta rakan sekerja yang licik akan bertanya kepada saya soalan: "Bagaimana jika kaedah itu memerlukan hujah, tetapi untuk sebarang nilai ia mesti mengembalikan hasil yang sama?". Jangan kita menulis:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Tidak, tiada siapa yang memaksa anda untuk menulis seperti itu. Jika anda ingin menambah peraturan pada objek olok-olok yang berfungsi untuk kaedah dengan sebarang hujah, maka terdapat objek khas untuk ini:
Mockito.any()
Contoh kami dengannya akan ditulis seperti ini:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Terdapat beberapa nuansa di sini. Objek Mockito.any()
mempunyai type Object
, jadi terdapat analog untuk parameter pelbagai jenis:
Kaedah | Jenis parameter | |
---|---|---|
1 | mana-mana() | Objek termasuk null |
2 | mana-mana(NamaKelas.kelas) | nama kelas |
3 | anyInt() | int |
4 | anyBoolean() | boolean |
5 | anyDouble() | berganda |
6 | anyList() | Senaraikan |
Lebih tepat lagi, contoh kami akan kelihatan seperti ini:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 kaedah doAnswer()
Kami sampai kepada tingkah laku kompleks kaedah maya. Lambat laun akan ada situasi apabila anda mahu kaedah maya ini mempunyai tingkah laku yang kompleks. Sebagai contoh, ia harus mengembalikan nilai bergantung pada parameter, menukar rentetan kepada huruf besar.
Terdapat kaedah khas untuk ini - doAnswer()
, yang diluluskan fungsi yang melakukan apa yang anda perlukan:
Mockito.doAnswer(function).when(an object).method name(parameter);
Mari jadikan kaedah get()
kelas List
mengembalikan kuasa dua hujah yang dihantar kepadanya. Dan tulis program berikut:
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
Kami mentakrifkan fungsi menggunakan objek kelas Jawapan.