Jak wyśmiewać metody typu void return?
Wdrożyłem wzorzec obserwatora, ale nie mogę kpić z Mockito, ponieważ nie wiem jak.
Próbowałem znaleźć przykład w Internecie, ale mi się nie udało.
Moja klasa wygląda następująco:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
System nie jest uruchamiany z próbą.
Chcę pokazać wyżej wymieniony stan systemu. I czyńcie według nich twierdzenia.
Odpowiedzi:
Spójrz na dokumenty Mockito API . Ponieważ powiązany dokument wspomina (punkt 12), można użyć dowolnego z
doThrow()
,doAnswer()
,doNothing()
,doReturn()
rodzina metod z Mockito ramach drwić void metod.Na przykład,
lub jeśli chcesz połączyć to z dalszym działaniem,
Zakładając, że próbujesz kpić z setera
setState(String s)
w poniższym klasowym świecie, kod używadoAnswer
metody do kpienia zsetState
.źródło
setRate()
jestfinal
i dlatego nie można go wyśmiewać. Zamiast tego spróbujcreate()
instancji, która robi to, czego potrzebujesz. Nie powinno być potrzeby kpićRateLimiter
.Myślę, że znalazłem prostszą odpowiedź na to pytanie, aby wywołać prawdziwą metodę tylko dla jednej metody (nawet jeśli ma ona nieważny zwrot), możesz to zrobić:
Lub możesz wywołać prawdziwą metodę dla wszystkich metod tej klasy, wykonując następujące czynności:
źródło
Dodając do tego, co powiedział @sateesh, gdy chcesz po prostu wyszydzić metodę void, aby zapobiec wywołaniu testu przez test, możesz użyć
Spy
następującego sposobu:Kiedy chcesz uruchomić test, upewnij się, że wywołujesz metodę testową na
spy
obiekcie, a nie naworld
obiekcie. Na przykład:źródło
Rozwiązaniem tak zwanego problemu jest użycie
spy
Mockito.spy (...) zamiastmock
Mockito.mock (..) .Szpieg umożliwia nam częściowe kpiny. Mockito jest dobry w tej kwestii. Ponieważ masz klasę, która nie jest kompletna, w ten sposób kpisz z wymaganego miejsca w tej klasie.
źródło
Po pierwsze: zawsze powinieneś importować mockito static, w ten sposób kod będzie znacznie bardziej czytelny (i intuicyjny):
Za częściowe kpiny i zachowanie oryginalnej funkcjonalności mockito oferuje „Szpiega”.
Możesz użyć tego w następujący sposób:
Aby wyeliminować wykonanie metody, możesz użyć czegoś takiego:
aby nadać metodzie niestandardowe zachowanie użyj „when” z „thenReturn”:
Więcej przykładów można znaleźć doskonałe próbki mockito w dokumencie.
źródło
Jak wyśmiewać puste metody za pomocą mockito - są dwie opcje:
doAnswer
- Jeśli chcemy, aby nasza metoda kpiny z pustki coś zrobiła (kpij z zachowania, mimo że jest nieważna).doThrow
- Wtedy jest,Mockito.doThrow()
jeśli chcesz rzucić wyjątek od szyderczej metody void.Poniżej znajduje się przykład jego użycia (nie jest to idealny przypadek użycia, ale chciałem tylko zilustrować podstawowe użycie).
Można znaleźć więcej szczegółów na temat sposobu drwić i przetestować void metod z Mockito w moim poście Jak Mock z Mockito (obszerny przewodnik z przykładami)
źródło
Dodanie kolejnej odpowiedzi do paczki (bez zamierzonej gry słów) ...
Musisz wywołać metodę doAnswer, jeśli nie możesz \ nie chcieć używać szpiega. Jednak niekoniecznie musisz rzucić własną odpowiedź . Istnieje kilka domyślnych implementacji. W szczególności CallsRealMethods .
W praktyce wygląda to tak:
Lub:
źródło
W Javie 8 można to uczynić nieco czystszym, zakładając, że masz statyczny import dla
org.mockito.Mockito.doAnswer
:Jest
return null;
to ważne i bez tego kompilacja nie powiedzie się z pewnymi dość niejasnymi błędami, ponieważ nie będzie w stanie znaleźć odpowiedniego zastępowaniadoAnswer
.Na przykład,
ExecutorService
który natychmiast wykonuje wszystkieRunnable
przekazane do,execute()
można zaimplementować za pomocą:źródło
Myślę, że twoje problemy wynikają z twojej struktury testowej. Trudno mi było łączyć drwiny z tradycyjną metodą implementacji interfejsów w klasie testowej (tak jak tutaj zrobiono).
Jeśli zaimplementujesz detektor jako próbkę, możesz następnie zweryfikować interakcję.
To powinno cię przekonać, że „świat” postępuje właściwie.
źródło
Używanie Mockito.doThrow jak w:
możesz spróbować tego miłego przykładu:
Źródło: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
źródło