4.1 Mga parameter ng pamamaraan

Ang mga nakaraang panuntunang idinagdag sa mock object ay tinalakay ang mga pamamaraan na walang mga parameter. At paano lumikha ng mga panuntunan para sa mga pamamaraan na may mga parameter? Bukod dito, nais kong lumikha ng mga panuntunan upang para sa ilang mga halaga ng parameter ay may isang resulta, at para sa iba - isa pa.

Ganyan mo rin magagawa. Kung nais mong ibalik ng pamamaraan ang isang bagay na tiyak na may isang tiyak na parameter, kung gayon ang panuntunan ay maaaring isulat tulad nito:

Mockito.doReturn(result).when(an object).method name(parameter);

Tingnan natin ang isang halimbawa upang mas maunawaan. Hayaang ibalik ng aming Listahan ang pangalang Ivan kapag humihiling ng ika-10 elemento, at ang pangalang Marya kapag humihiling ng ika-500. Wala pang sinabi at tapos na.

@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 Mga template ng parameter

At agad na tatanungin ako ng mga tusong kasamahan: "Paano kung ang pamamaraan ay nangangailangan ng mga argumento, ngunit para sa anumang mga halaga dapat itong ibalik ang parehong resulta?". Huwag nating isulat:

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

Hindi, walang pumipilit sa iyo na magsulat ng ganyan. Kung gusto mong magdagdag ng panuntunan sa isang mock na bagay na gumagana para sa isang pamamaraan na may anumang mga argumento, pagkatapos ay mayroong isang espesyal na bagay para dito:

Mockito.any()

Ang aming halimbawa dito ay isusulat tulad nito:

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

Mayroong ilang mga nuances dito. Ang bagay Mockito.any()ay may uri Object, kaya may mga analogue para sa mga parameter ng iba't ibang uri:

Pamamaraan Uri ng parameter
1 anumang() Bagay kasama ang null
2 anumang(ClassName.class) pangalan ng klase
3 anyInt() int
4 anyBoolean() boolean
5 anyDouble() doble
6 anyList() Listahan

Mas tama, ang aming halimbawa ay magiging ganito:

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 doAnswer() na pamamaraan

Nakarating kami sa kumplikadong pag-uugali ng mga virtual na pamamaraan. Maaga o huli, magkakaroon ng sitwasyon kung kailan mo gustong magkaroon ng kumplikadong pag-uugali ang virtual na pamamaraang ito. Halimbawa, dapat itong ibalik ang mga halaga depende sa mga parameter, i-convert ang string sa upper case.

Mayroong isang espesyal na paraan para dito - doAnswer(), na ipinasa sa isang function na ginagawa ang kailangan mo:

Mockito.doAnswer(function).when(an object).method name(parameter);

Ibalik natin sa get()class method Listang parisukat ng argumentong ipinasa dito. At isulat ang sumusunod na programa:

@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));
    }
}

Tinukoy namin ang function gamit ang isang object ng Answer class.