4.1 Metodlarning parametrlari
Mock-obyektga qo‘shilgan oldingi qoidalar parametrsiz metodlarga tegishli edi. Parametrlari bo'lgan metodlar uchun qoidalarni qanday yaratish mumkin? Bundan tashqari, parametr qiymatlariga ko'ra bir natija, boshqa qiymatlar uchun esa boshqa natijalar olish qanchalik ajoyib bo'lardi.
Buni ham qilish mumkin. Agar siz ma'lum bir parametrda metod nimanidir qaytarishini xohlasangiz, qoidani shunday yozishingiz mumkin:
Mockito.doReturn(natija).when(obyekt).metodNomi(parametr);
Endi buni yaxshiroq tushunish uchun misol keltiramiz. Bizning List 10-chi elementni so'raganda "Ivan" ismini, 500-chi elementni so'raganda esa "Марья" ismini qaytarsin.
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//birinchi qoidani qo'shish
Mockito.doReturn("Ivan").when(mockList).get(10);
//ikkinchi qoidani qo'shish
Mockito.doReturn("Марья").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Марья", mockList.get(500));
}
}
4.2 Parametrlarning andozalari
Savol tug'iladi: "Metod argumentlar talab qilsa, lekin har qanday qiymatda bir xil natijani qaytarishi kerak bo'lsa-chi?". Biz shunday yozamizmi:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Yo'q, sizni bunday yozishga majbur qilinmaydi. Agar siz mock-obyektga metodni har qanday argumentlari bilan ishlaydigan qoidani qo'shishni xohlasangiz, maxsus obyekt mavjud:
Mockito.any()
Misolimiz shunday yoziladi:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Bu yerda ba'zi nuqtalar bor. Mockito.any() obyekti Object tipiga ega, shuning uchun har xil turdagi parametrlarga uning muqobillari mavjud:
| Metod | Parametr turi | |
|---|---|---|
| 1 | any() | Object, null ni ham o‘z ichiga oladi |
| 2 | any(ClassName.class) | ClassName |
| 3 | anyInt() | int |
| 4 | anyBoolean() | boolean |
| 5 | anyDouble() | double |
| 6 | anyList() | List |
To‘g‘riroq bo‘lishi uchun misolimiz shunday ko'rinishi kerak:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer() metodi
Biz virtual metodlarning murakkab xatti-harakatlariga yetib keldik. Qachondir bu virtual metod murakkab xatti-harakatlarga ega bo'lishini xohlasangiz, masalan, parametrlariga qarab qiymatlar qaytarishi, satrni yuqori registrga o'zgartirishi kerak bo'lsa.
Buning uchun maxsus metod – doAnswer() mavjud bo'lib, unga kerakli ishni bajarayotgan funktsiya uzatiladi:
Mockito.doAnswer(funktsiya).when(obyekt).metodNomi(parametr);
Endi List klassidagi get() metodini argument sifatida uzatilgan sonning kvadratini qaytarishga majbur qilamiz va shunday dastur yozamiz:
@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));
}
}
Funktsiyani Answer klassi yordamida belgiladik.
GO TO FULL VERSION