Mam metodę, która jest wywoływana dwukrotnie i chcę uchwycić argument drugiego wywołania metody.
Oto, co próbowałem:
ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()
Ale dostaję TooManyActualInvocations
wyjątek, ponieważ Mockito uważa, że doSomething
należy to nazwać tylko raz.
Jak mogę zweryfikować argument drugiego wywołania doSomething
?
java
unit-testing
mocking
mockito
Eric Wilson
źródło
źródło
doSomething()
w każdym osobnym wywołaniu?Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);
przechwycony argument będzie dwa razy taki sam (ponieważ w rzeczywistości jest to obiekt tej samej osoby), więccapturedPeople.get(0).getName() == capturedPeople.get(1).getName() == "Jane"
zobacz także groups.google.com/forum/#!msg/mockito/ KBRocVedYT0 / 5HtARMl9r2wJ .Runnable
) i, jeśli to konieczne, zrobiłbyś bardziej szczegółową kontrolę typu na przechwyconym argumencie.Od wersji Mockito 2.0 istnieje również możliwość użycia metody statycznej Matchers.argThat (ArgumentMatcher) . Przy pomocy Java 8 pisanie jest teraz znacznie łatwiejsze i bardziej czytelne:
Jeśli jesteś przywiązany do niższej wersji Java, jest też niezły:
Oczywiście żaden z nich nie może zweryfikować kolejności połączeń - do których należy użyć InOrder :
Proszę spojrzeć na projekt mockito-java8 , który umożliwia wykonywanie połączeń takich jak:
źródło
CharSequence
. Czy znasz jakiś sposób na prawidłowe wydrukowanie raportu „poszukiwany” argument?Jeśli nie chcesz sprawdzać poprawności wszystkich połączeń
doSomething()
, możesz użyć tylko ostatniegoArgumentCaptor.getValue()
. Według Mockito javadoc :Jeśli metoda została wywołana wiele razy, wówczas zwraca ostatnią zarejestrowaną wartość
To by zadziałało (zakładając, że
Foo
ma metodęgetName()
):źródło
Możesz także użyć @Captor z komentarzem ArgumentCaptor. Na przykład:
źródło
W lambdach Java 8 wygodnym sposobem jest użycie
źródło
Po pierwsze: zawsze powinieneś importować mockito static, w ten sposób kod będzie znacznie bardziej czytelny (i intuicyjny) - poniższe przykłady kodu wymagają jego działania:
W metodzie Verse () można przekazać ArgumentCaptor, aby zapewnić wykonanie testu, oraz ArgumentCaptor, aby ocenić argumenty:
Lista wszystkich przekazanych argumentów podczas testu jest dostępna za pomocą metody argument.getAllValues ().
Wartość pojedynczego (ostatnio wywoływanego) argumentu jest dostępna poprzez argument.getValue () w celu dalszej manipulacji / sprawdzania lub cokolwiek innego, co chcesz zrobić.
źródło