Mockito – Spy

Obiekt typu Spy – coś pomiędzy obiektem Mockowym a obiektem normalnym. 

Spy – jest tak jakby wrapperem czyli obiektem opakowującym obiekt danej klasy którego działanie możemy śledzić oraz weryfikować podobnie jak to jest z obiektami mokowymi. Dodatkowo działanie jego metod możemy także mokować. Spay byłyby wtedy częściowo obiektem a częściowo mockiem dlatego na obiekty typy spay mówi się partial mocki.

W sytuacji gdy chcemy korzystac z prawdziwego zachowania częsci metod w obiekcie a zachowanie innych metod chcemy mokowac i chcemy mieć możliwośc wywolaia metod zachowując ich prawdziwe zachowanie to pownniśmy skorzystac z obietku typu spy. Do utworzenia takiegoobiektu sluży metoda spy która przyjmuje w paramatrze nazwęKLasy.classnp Meal meal =spy(Meal.class); Spy może korzystać z konstruktora bezparametrowego więc trzeba pamiętać aby katki skonstruktor znajdowla się w klasie danego obiektu.

Tworzymy nową instancję klasy meal jako obiekt typu Spy. Programujemy działanie dwóch metod tego obiektu za pomocą metody given. Na obiekcie Spy wywołujemy mtodę sumPrice która jest prawdziwa metodą. Następnie weryfikujemy mockowane metody i odpowiednią asercją sprawdzamy wynik testu.

//  given
Meal meal = spy(Meal.class);
given(meal.getPrice()).willReturn(15);  
given(meal.getQuantity()).willReturn(3); // metoda typu spy
//  when
int result = meal.sumPrice();
//  then
then(meal).should().getPrice(); 
then(meal).should().getQuantity();
assertThat(result, equalTo(45));

jeżeli chcemy skorzystac z obiketu typu Sypi konstryktora który zaiwera kilka parametrów to wystrcze żęna początku metody testowej zdefiniujemy taki obiekt np.: Meal meal = new Meal(10, „pizza”); zaś do metody spy przekażemy po prostu: spy(meal);

Jeżeli zaś chcieli byśmy utworzyć obiekt Spy dla większej ilości testów wygodnie jest skorzystać z adnotacji

@ExtendWith(MockitoExtension.class)
class MealTest {
@Spy
private Meal mealSpy;

@Test
void testMealSumPriceWithSpy(){
//  given
given(mealSpy.getPrice()).willReturn(15);  
given(mealSpy.getQuantity()).willReturn(3);
//  when
int result =   mealSpy .sumPrice(); 
//   then
then(mealSpy).should().getPrice(); 
then(mealSpy).should().getQuantity();
assertThat(result, equalTo(45));
    }
}

Podsumowując obiekty Spy są to obiekty hybrydowe pomiędzy Mockami a prawdziwymi obiektami. Dzięki czemu możemy mieszać działanie metod mockowych i normalnych.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *