Googlowałem na ten temat, ale nie znalazłem nic istotnego. Mam coś takiego:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Teraz chcę sprawdzić, czy to mymethod(Object o)
, co nazywa się wewnątrz runtestmethod()
, zostało wywołane z Obiektem o
, a nie z żadnym innym. Ale zawsze zdaję test, niezależnie od tego, co poddam weryfikacji, na przykład:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
lub
Mockito.verify(mock.mymethod(Mockito.eq(null)));
lub
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Zawsze zdaję test. Jak mogę przeprowadzić tę weryfikację (jeśli to możliwe)?
Dziękuję Ci.
java
unit-testing
junit
mockito
manolowar
źródło
źródło
Czy próbujesz osiągnąć logiczną równość, korzystając z metody .equals obiektu? Możesz to zrobić, korzystając z argumentu argThat, który jest zawarty w Mockito
Następnie możesz zaimplementować własny moduł dopasowywania argumentów, który będzie odraczał metodę .equals każdego obiektu
Teraz za pomocą kodu możesz go zaktualizować, aby czytać ...
Jeśli chcesz uzyskać DOKŁADNĄ równość (ten sam obiekt w pamięci), po prostu zrób
Spowoduje to sprawdzenie, że raz został wywołany.
źródło
ReflectionEquals
tym celu możesz użyć wbudowanej klasy.verify(mock).mymethod(obj);
nie sprawdza DOKŁADNEJ równości (ten sam obiekt w pamięci). Zamiast tego używa metody equals-method, która mogła zostać zastąpiona.ArgumentMatcher
aby być mniej gadatliwym.verify()
wywołujeequals()
metodę / argument argumentu / inbound , a nie metodę / record object /equals()
. nie ma to znaczenia, chyba że próbujesz potwierdzić, że badany obiekt zwraca określoną instancję obiektu, a podmiot zwraca zamiast tego coś, co powinno być przezroczystym dekoratorem tej instancji. Doverify
użytkownika argumentówequals()
nie wiem od dekoratora; podczas gdy dekoratorzyequals()
zostaną przepisani, aby tolerować oryginał. W tym przypadku test fałszywie się nie powiedzie.eq
dopasowywania, jeśli nie używasz innych dopasowań..verify(mock)
. Teraz inicjujesz weryfikację wyniku wywołania metody, nie weryfikując niczego (nie wykonując wywołania metody). Dlatego wszystkie testy przebiegają pomyślnie.Twój kod powinien wyglądać następująco:
źródło
argThat
plus lambdaw ten sposób możesz zawieść weryfikację argumentów:
gdzie
argThat
plus zapewniapowyższy test „powie”
Expected: lambda$... Was: YourClass.toSting...
. Możesz uzyskać dokładniejszą przyczynę niepowodzenia, jeśli używasz twierdzeń w lambda:ALE: TO TYLKO DZIAŁA Z 1 METODĄ WEZWANIA. Jeśli zweryfikowana metoda wywoływana jest 2 razy, mockito przekazuje wszystkie wywoływane kombinacje każdemu weryfikatorowi. Zatem mockito oczekuje, że weryfikator po cichu zwraca
true
jeden zestaw argumentów ifalse
(bez wyjątków) dla innych prawidłowych wywołań. Oczekiwanie to nie stanowi problemu dla 1 wywołania metody - powinno po prostu zwrócić true 1 raz.Teraz test mówi:
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. UWAGA: UżyłemassertJ
asercji, ale to od Ciebie zależy, która struktura asercji będzie używana.argThat
z wieloma argumentami.Jeśli używasz
argThat
, wszystkie argumenty muszą być dopasowane. Na przykład:gdzie:
eq
dopasowującynajprostszym sposobem sprawdzenia, czy argument jest równy:
bezpośredni argument
jeśli porównanie przez odniesienie jest dopuszczalne, przejdź do:
Przyczyną awarii oryginalnego pytanie było złe miejsce z paranthes:
verify(mock.mymethod...
. To było złe. Prawo byłoby:verify(mock).*
źródło
Użyłem Mockito.verify w ten sposób
źródło
Czy sprawdziłeś metodę equals dla możliwej do wyśmiewania klasy? Jeśli ta zwraca zawsze true lub testujesz tę samą instancję na tej samej instancji, a metoda równości nie jest nadpisywana (a zatem sprawdza tylko referencje), wówczas zwraca true.
źródło
Inną metodą jest użycie metody org.mockito.internal.matchers.Equals.Equals zamiast ponownego zdefiniowania jednej:
źródło
Czy próbowałeś tego z tym samym () dopasowaniem? Jak w:
Miałem ten sam problem. Próbowałem z matcherem eq (), a także matcherem refEq (), ale zawsze miałem fałszywie dodatnie wyniki. Gdy użyłem tego samego () modułu dopasowującego, test nie powiódł się, gdy argumenty były różnymi instancjami i przeszedł, gdy argumenty były tej samej instancji.
źródło
Możesz także użyć TypeSafeDiagnosingMatcher
Następnie sprawdź to wywołanie:
źródło