3.1 doReturn() yöntemi
Şimdi sihir geliyor...
Diyelim ki sahte bir sahte nesne yarattınız, ancak bir şekilde çalışması için ona ihtiyacınız var. Belirli yöntemler çağrıldığında, önemli bir şey yapılmıştır veya yöntemler belirli bir sonuç döndürmüştür. Ne yapalım?
Mockito kitaplığı, istediğiniz davranışı sahte bir nesneye eklemenizi sağlar.
Sahte bir nesnenin, belirli bir yöntem çağrıldığında belirli bir sonuç döndürmesini istiyorsanız, bu "kural", kod kullanılarak nesneye eklenebilir:
Mockito.doReturn(result).when(an object).method name();
Görüyorsunuz, yöntem çağrısının sonunda, method name?
aslında burada devam eden bir çağrı yok. Yöntem, doReturn()
nesnenin yöntemlerinin çağrılarını izlediği özel bir proxy nesnesi döndürür ve böylece kural yazılır.
Tekrar. Sahte bir nesneye eklemek için bir kural yazmanın çok akıllıca bir yolu . Böyle bir kodu gördüğünüzde kafanızda doğru bir şekilde yorumlamak biraz beceri gerektirir. Tecrübe ile gelir.
Bence somut bir örneğe ihtiyaç var. Bir sahte sınıf nesnesi oluşturalım ArrayList
ve yönteminden size()
10 sayısını döndürmesini isteyelim. Kodun tamamı şöyle görünecek:
@ExtendWith(MockitoExtension.class)
class DoReturnTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation () {
//create a rule: return 10 when calling the size method
Mockito.doReturn(10).when(mockList).size();
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
Evet, bu kod çalışacak, test başarısız olmayacak.
3.2 when() yöntemi
Sahte bir nesneye davranış kuralı eklemenin başka bir yolu daha vardır - Mockito.when()
. Şuna benziyor:
Mockito.when(an object.method name()).thenReturn(result);
Bu, bir sahte nesne davranış kuralı yazmanın bir öncekiyle aynı yoludur. Karşılaştırmak:
Mockito.doReturn(result).when(an object).method name();
Burada tamamen aynı şey olur - yeni bir kuralın inşası.
Doğru, ilk örneğin iki eksisi var:
- çağrı çok kafa karıştırıcı.
an object.method name()
methodname()
yöntem dönerse çalışmazvoid
.
Peki, kullanarak en sevdiğimiz örneği yazalımMockito.when()
@ExtendWith(MockitoExtension.class)
class WhenTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//create a rule: return 10 when calling the size method
Mockito.when(mockList.size() ).thenReturn(10);
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
3.3 doThrow() yöntemi
Sahte bir nesne yönteminin belirli bir sonuç döndürmesini nasıl sağlayacağımızı bulduk. Belirli bir istisna atmasını nasıl sağlayabilirim? Göndermek mi doReturn()
?
Yöntemin geri dönmesini, yani bir istisna atmasını önlemek için, doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
Ve sonra ikinci seçenek:
Mockito.when(an object.method name()).thenThrow(exception.class);
Biraz bekleniyor, değil mi?
Görüyorsun, zaten anlamaya başlıyorsun. Bir örnekle düzeltelim:
@ExtendWith(MockitoExtension.class)
class DoThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
mockList.size(); //an exception will be thrown here
}
}
Belirli bir istisna nesnesi atmanız gerekiyorsa, formun yapısını kullanın:
Mockito.doThrow(new Exception()).when(an object).method name();
Yönteme bir istisna nesnesi iletmeniz yeterlidir doThrow()
ve bu, yöntem çağrısı sırasında atılacaktır.