JavaRush /Курстар /All lectures for KK purposes /Объекттерді мокификациялау

Объекттерді мокификациялау

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді

3.1 doReturn() әдісі

Енді сиқыр басталады...

Мысалы, сен фейк мок-объект жасадың, бірақ оның қалай жұмыс істеуін қаласаң да керек болады. Белгілі бір әдістерді шақырғанда маңызды нәрсе орындалу керек немесе әдістер белгілі бір нәтиже қайтару керек. Қайтеміз?

Mockito кітапханасы мок-объектіге қажетті мінез-құлықты қосуға мүмкіндік береді.

Егер сен белгілі бір әдісті шақырғанда мок-объект белгілі бір нәтиже қайтарғанын қаласаң, онда бұл «ереже» объектке мынадай код арқылы қосылады:

Mockito.doReturn(нәтиже).when(объект).әдісАты();

Көрдің бе, әдіс шақырылған кезде әдісАты ? Мұнда ешқандай нақты шақыру болмайды. doReturn() арнайы proxy-объекті қайтарып, әдістердің шақырылуын бақылайды және осылайша ережені жазады.

Тағы бір рет. Бұл мок-объектіге қосылатын ережені жазудың айласы. Мұндай кодты көргенде оны басында дұрыс интерпретациялау үшін белгілі бір шеберлік керек. Тәжірибемен келеді.

Меніңше, нақты мысал керек. Класс ArrayList-тың мок-объектісін жасап, оның size() әдісін 10 санын қайтаратындай қылып жасайық. Толық код осылай көрінеді:


@ExtendWith(MockitoExtension.class)
class DoReturnTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation () {
         //ереже жасаймыз: size әдісін шақырғанда 10 қайтару
        Mockito.doReturn(10).when(mockList).size();

        //мұнда әдіс шақырылып, 10 қайтарады!!
        assertEquals(10, mockList.size());  
    }
}

Иә, бұл код жұмыс істейді, тест құламайды.

3.2 when() әдісі

Мок-объектіге мінезді қосуға тағы бір әдіс бар - Mockito.when() әдісін шақыру. Мынандай көрінеді:

Mockito.when(объект.әдісАты()).thenReturn(нәтиже);

Бұл да мок-объект мінезін жазудың алдыңғыдай әдісі. Салыстырыңыз:

Mockito.doReturn(нәтиже).when(объект).әдісАты();

Мұнда да солай - жаңа ережені жасау.

Бірінші мысалда екі минус бар:

  • шақыру объект.әдісАты() шатастырады.
  • әдісАты() әдісі void қайтарса жұмыс істемейді.

Және сүйікті мысалды Mockito.when() арқылы жазайық


@ExtendWith(MockitoExtension.class)
class WhenTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation() {
        //ереже жасаймыз: size әдісін шақырғанда 10 қайтару
        Mockito.when(mockList.size() ).thenReturn(10); 

        //мұнда әдіс шақырылып, 10 қайтарады!!
        assertEquals(10, mockList.size());  
    }
}

3.3 doThrow() әдісі

Мок-объектінің әдісін белгілі бір нәтиже қайтаруды қалай орнатуды көрдік. Ал егер ол белгілі бір қателікті тастауды қаласа ше? Оны doReturn() арқылы беруге бола ма?

Әдіс ештеңе қайтармауы үшін, тек қателікті «лақтыру» үшін doThrow() әдісін пайдаланып ережені орнату керек.

Mockito.doThrow(қате.class).when(объект).әдісАты();

Енді солай болып тұр?

Mockito.when(объект.әдісАты()).thenThrow(қате.class);

Сәл күтілген бе, жоқ па?

Міне, сен қазір түсініп жатырсың. Мысалмен бекітейік:


@ExtendWith(MockitoExtension.class)
class DoThrowTest {
 @Mock
 List mockList;
 
 @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); //мұнда қате лақтырады
    }
}

Егер белгілі бір қате объектті лақтыру керек болса, онда келесі конструкцияны қолданыңыз:

Mockito.doThrow(new Қате()).when(объект).әдісАты();

Жай ғана doThrow() әдісіне қате объектін бер және ол әдіс шақырылған кезде лақтырылады.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION