JavaRush /Kurslar /All lectures for UZ purposes /Obyektlarni mock qilish

Obyektlarni mock qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud

3.1 Metod doReturn()

Endi esa biroz sehr...

Faraz qilaylik, sen bir fake mock-obyekt yaratding, lekin u qanday ishlashi kerakligini bilasanmi. Ba'zi metodlar chaqirilganda muhim bir narsa yoki aniq bir natija qaytishi kerak bo'ladi. Nima qilish kerak?

Mockito kutubxonasi mock-obyektga kerakli xatti-harakatni qo'shish imkonini beradi.

Agar ma'lum bir metod chaqirilganda, mock-obyekt aniq natija qaytarishini xohlasang, bu "qoidani" obyektga kod yordamida qo'shish mumkin:

Mockito.doReturn(natija).when(obyekt).metodNomi();

Ko'ryapsanmi, metodNomi? Bu yerda aslida hech qanday chaqiriq bo'lmaydi. doReturn() metodi obyekt metodlarini kuzatuvchi maxsus proxy-obyektni qaytaradi va shu yo'l bilan qoida yoziladi.

Yana bir bor. Bu oddiygina bir makkor yo'l bilan mock-obyektga qo'shiladigan qoida yozish usuli. Bunday kodni ko'rganingda, uni boshda to'g'ri talqin qilish uchun ma'lum bir tajriba kerak. Tajriba bilan keladi.

O'ylayman, aniq misol kerak. Keling, ArrayList klassidan mock-obyekt yaratamiz va uning size() metodiga 10 raqamini qaytarishni so'raymiz. To'liq kod quyidagi kabi ko'rinadi:


@ExtendWith(MockitoExtension.class)
class DoReturnTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation () {
         // metod size chaqirilganda 10 qaytishini qoida qilamiz
        Mockito.doReturn(10).when(mockList).size();

        // bu yerda metod chaqiriladi va 10 qaytaradi!!
        assertEquals(10, mockList.size());  
    }
}

Ha, bu kod ishlaydi, test tushmaydi.

3.2 Metod when()

Mock-obyektga xatti-harakat qo'shishning yana bir usuli bor – Mockito.when() metodini chaqirish orqali. Bu quyidagicha ko'rinadi:

Mockito.when(obyekt.metodNomi()).thenReturn(natija);

Bu mock-obyekt xatti-harakatlarini yozishning oldingi kabi usuldir. Solishtir:

Mockito.doReturn(natija).when(obyekt).metodNomi();

Bu yerda mutlaqo bir xil ish – yangi qoidani tuzish sodir bo'lmoqda.

Birinchi misolning ikki kamchiliklari bor:

  • obyekt.metodNomi() chaqirig'i adashtirishi mumkin.
  • agar metodNomi() metodi void qaytarsa, u ishlamaydi.

Xo'sh, bizga yoqadigan misolni Mockito.when() bilan yozamiz:


@ExtendWith(MockitoExtension.class)
class WhenTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation() {
        // metod size chaqirilganda 10 qaytishini qoida qilamiz
        Mockito.when(mockList.size() ).thenReturn(10); 

        // bu yerda metod chaqiriladi va 10 qaytaradi!!
        assertEquals(10, mockList.size());  
    }
}

3.3 Metod doThrow()

Biz mock-obyekt metodining aniq natija qaytarishini qanday amalga oshirishni tushundik. Lekin qanday qilib u aniq bir exception tashlashini amalga oshirish mumkin? Yoki doReturn() ga uni uzatamizmi?

Agar metod natija qaytarmasa, balki exception tashlasa (throw), bu qoidani doThrow() metodi orqali belgilash kerak.

Mockito.doThrow(exception.class).when(obyekt).metodNomi();

Va darhol ikkinchi variant:

Mockito.when(obyekt.metodNomi()).thenThrow(exception.class);

Biroz kutilgan, to'g'rimi?

Mana ko'ryapsan, sen endi boshqarishni boshlayapsan. Misol bilan mustahkamlaymiz:


@ExtendWith(MockitoExtension.class)
class DoThrowTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); // bu yerda exception tashlanadi
    }
}

Agar aniq bir exception obyektini tashlash kerak bo'lsa, quyidagi konstruktsiyadan foydalan:

Mockito.doThrow(new Exception()).when(obyekt).metodNomi();

Shunchaki doThrow() metodiga exception obyektini uzat va u metod chaqirilganda tashlanadi.

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