Mam wywołanie metody, które chcę wyśmiewać za pomocą mockito. Na początek stworzyłem i wstrzyknąłem instancję obiektu, na którym zostanie wywołana metoda. Moim celem jest zweryfikowanie jednego z obiektów w wywołaniu metody.
Czy istnieje sposób, w jaki mockito pozwala potwierdzić lub zweryfikować obiekt i jego atrybuty, gdy wywoływana jest metoda mock?
przykład
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Zamiast tego anyObject()
chcę sprawdzić, czy obiekt argumentu zawiera określone pola
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Odpowiedzi:
Nowa funkcja dodana do Mockito sprawia, że jest to jeszcze łatwiejsze,
Zobacz dokumentację Mockito
W przypadku, gdy istnieje więcej niż jeden parametr i pożądane jest przechwytywanie tylko jednego parametru, użyj innych ArgumentMatchers, aby zawinąć pozostałe argumenty:
źródło
Myślę, że najłatwiejszym sposobem weryfikacji obiektu argumentu jest użycie
refEq
metody:Można go użyć, nawet jeśli obiekt nie implementuje
equals()
, ponieważ używane jest odbicie. Jeśli nie chcesz porównywać niektórych pól, po prostu dodaj ich nazwy jako argumentyrefEq
.źródło
Jeszcze jedną możliwością, jeśli nie chcesz używać
ArgumentCaptor
(na przykład, ponieważ używasz również stubowania), jest użycie Hamcrest Matchers w połączeniu z Mockito.źródło
Matchers
pakiet jest poprawny, ponieważ pisanie tego samego wiersza kodu zorg.mockito.Matchers
klasą wprowadza mylący wyjątek stwierdzający, że parametr funkcji próbnej po prostu nie pasuje.MockitoHamcrest.argThat()
i nie jestMockito.argThat()
Jest to odpowiedź oparta na odpowiedzi z iraSenthil, ale z adnotacją ( Captor ). Moim zdaniem ma to kilka zalet:
Przykład:
źródło
captor.getAllValues()
. Metodacaptor.getValue()
zastosowana w odpowiedzi daje ostatni wynik.Jeśli używasz Java 8, możesz użyć wyrażeń Lambda, aby dopasować.
Przykładowe połączenie
Więcej informacji: http://source.coveo.com/2014/10/01/java8-mockito/
źródło
Powyższe rozwiązania tak naprawdę nie działały w moim przypadku. Nie mogłem użyć ArgumentCaptor, ponieważ metoda była wywoływana kilka razy i musiałem sprawdzić każdą z nich. Prosty Matcher z „argThat” z łatwością sobie poradził.
Custom Matcher
Test Runner
źródło
I bardzo ładne i czyste rozwiązanie w Koltinie z
com.nhaarman.mockito_kotlin
źródło
Możesz odnieść się do następujących kwestii:
Spowoduje to sprawdzenie, czy metoda mockedObject jest wywoływana z pożądanymObject jako parametrem.
źródło
Kolejny łatwy sposób to zrobić:
źródło
Jawadok dla refEq wspomniał, że kontrola równości jest płytka! Więcej informacji można znaleźć pod linkiem poniżej:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...)][1]
Problem z „płytką równością” nie może być kontrolowany, gdy używasz innych klas, które nie implementują metody .equals (), klasa „DefaultMongoTypeMapper” jest przykładem, w którym metoda .equals () nie jest zaimplementowana.
org.springframework.beans.factory.support oferuje metodę, która może wygenerować definicję komponentu bean zamiast tworzyć instancję obiektu, i można jej użyć do pozbycia się niepowodzenia porównania.
** „Definicja fasoli jest tylko opisem fasoli, a nie samą fasolą. Opisy fasoli poprawnie implementują equals () i hashCode (), więc zamiast tworzyć nową DefaultMongoTypeMapper (), zapewniamy definicję, która mówi wiosnie, jak to się dzieje powinien utworzyć „
W twoim przykładzie możesz zrobić coś takiego
źródło
Uproszczone rozwiązanie bez tworzenia nowej klasy implementacji Matcher i używania wyrażenia lambda:
źródło