4.1 Yöntem parametreleri

Sahte nesneye eklenen önceki kurallar, parametresiz yöntemlerle ilgiliydi. Parametreli yöntemler için kurallar nasıl oluşturulur? Ayrıca, bazı parametre değerleri için bir sonuç ve diğerleri için başka bir sonuç olacak şekilde kurallar oluşturmak istiyorum.

Bu şekilde siz de yapabilirsiniz. Metodun belirli bir parametre ile belirli bir şeyi döndürmesini istiyorsanız, kural şu ​​şekilde yazılabilir:

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

Daha iyi anlamak için bir örneğe bakalım. Listemiz, 10. elementi isterken Ivan adını ve 500. elementi isterken Marya adını döndürsün. Daha erken olmaz dedi ve bitirdi.

@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 Parametre şablonları

Ve hemen kurnaz meslektaşlar bana şu soruyu soracaklar: "Ya yöntem argümanlar gerektiriyorsa, ancak herhangi bir değer için aynı sonucu döndürmesi gerekiyorsa?" Yazmayalım:

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

Hayır, kimse seni böyle yazmaya zorlamıyor. Herhangi bir argüman içeren bir yöntem için çalışan sahte bir nesneye bir kural eklemek istiyorsanız, bunun için özel bir nesne vardır:

Mockito.any()

Bununla ilgili örneğimiz şöyle yazılır:

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

Burada birkaç nüans var. Nesnenin Mockito.any()türü vardır Object, bu nedenle farklı türlerdeki parametreler için analoglar vardır:

Yöntem parametre tipi
1 herhangi() Null dahil nesne
2 herhangi(SınıfAdı.sınıf) sınıf adı
3 herhangiInt() int
4 herhangi birBoolean() mantıksal
5 herhangiDouble() çift
6 herhangiListe() Liste

Daha doğrusu, örneğimiz şöyle görünecektir:

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

4.3 doAnswer() yöntemi

Sanal yöntemlerin karmaşık davranışına ulaştık. Er ya da geç, bu sanal yöntemin karmaşık davranışlara sahip olmasını istediğiniz bir durum olacaktır. Örneğin, parametrelere bağlı olarak değerler döndürmeli, dizeyi büyük harfe çevirmelidir.

doAnswer()Bunun için - ihtiyacınız olanı yapan bir işleve iletilen özel bir yöntem vardır :

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

get()Sınıf yönteminin Listkendisine iletilen argümanın karesini döndürmesini sağlayalım . Ve aşağıdaki programı yazın:

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

Fonksiyonu, Answer sınıfının bir nesnesini kullanarak tanımladık.