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()metodivoidqaytarsa, 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.
GO TO FULL VERSION