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 List
kendisine 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.
GO TO FULL VERSION