4.1 Parameter metode
Aturan sebelumnya yang ditambahkan ke objek tiruan berurusan dengan metode tanpa parameter. Dan bagaimana cara membuat aturan untuk metode dengan parameter? Selain itu, saya ingin membuat aturan sehingga untuk beberapa nilai parameter ada satu hasil, dan untuk yang lain - yang lain.
Begitulah cara Anda bisa melakukannya juga. Jika Anda ingin metode mengembalikan sesuatu yang spesifik dengan parameter tertentu, maka aturannya dapat ditulis seperti ini:
Mockito.doReturn(result).when(an object).method name(parameter);
Mari kita lihat contoh untuk memahami lebih baik. Biarkan Daftar kami mengembalikan nama Ivan saat meminta elemen ke-10, dan nama Marya saat meminta elemen ke-500. Tidak lama kemudian diucapkan daripada dilakukan.
@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 Template Parameter
Dan segera kolega yang licik akan menanyakan pertanyaan kepada saya: "Bagaimana jika metode ini membutuhkan argumen, tetapi untuk nilai apa pun harus mengembalikan hasil yang sama?". Mari kita tidak menulis:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Tidak, tidak ada yang memaksa Anda untuk menulis seperti itu. Jika Anda ingin menambahkan aturan ke objek tiruan yang berfungsi untuk metode dengan argumen apa pun, maka ada objek khusus untuk ini:
Mockito.any()
Contoh kami dengan itu akan ditulis seperti ini:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Ada beberapa nuansa di sini. Objek Mockito.any()
memiliki type Object
, jadi ada analog untuk parameter dari berbagai jenis:
metode | Jenis parameter | |
---|---|---|
1 | setiap() | Objek termasuk null |
2 | any(NamaKelas.kelas) | nama kelas |
3 | anyInt() | int |
4 | anyBoolean() | boolean |
5 | anyDouble() | dobel |
6 | anyList() | Daftar |
Lebih tepatnya, contoh kita akan terlihat seperti ini:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 metode doAnswer()
Kami sampai pada perilaku kompleks dari metode virtual. Cepat atau lambat akan ada situasi ketika Anda ingin metode virtual ini memiliki perilaku yang kompleks. Misalnya, harus mengembalikan nilai tergantung pada parameter, mengubah string menjadi huruf besar.
Ada metode khusus untuk ini - doAnswer()
, yang melewati fungsi yang melakukan apa yang Anda butuhkan:
Mockito.doAnswer(function).when(an object).method name(parameter);
Mari buat metode get()
kelas List
mengembalikan kuadrat dari argumen yang diteruskan ke sana. 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 mendefinisikan fungsi menggunakan objek dari kelas Jawaban.