CodeGym /Java Course /Modul 3 /Memanggil metode tiruan dengan parameter

Memanggil metode tiruan dengan parameter

Modul 3
Level 4 , Pelajaran 3
Tersedia

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 Listmengembalikan 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.

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION