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.