Próbuję przetestować jakiś starszy kod, używając Mockito.
Chcę wkleić plik FooDao
używany w produkcji w następujący sposób:
foo = fooDao.getBar(new Bazoo());
Umiem pisać:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Ale oczywistym problemem jest to, że getBar()
nigdy nie jest wywoływany z tym samym Bazoo
obiektem, dla którego zastosowałem metodę. (Przeklnij tego new
operatora!)
Bardzo by mi się podobało, gdybym mógł zlikwidować metodę w taki sposób, że zwraca ona myFoo
niezależnie od argumentu. W przeciwnym razie wysłucham innych sugestii dotyczących obejścia tego problemu, ale naprawdę chciałbym uniknąć zmiany kodu produkcyjnego, dopóki nie będzie rozsądnego zasięgu testu.
java
unit-testing
mocking
mockito
Eric Wilson
źródło
źródło
notNull(Bazoo.class)
taki jakany(Bazoo.class)
(być może nie istniał w czasie tej odpowiedzi)Bazoo
lubCazoo
które są, powiedzmy, podklasamiAzoo
. boBazoo
musiałem wrócićfoo
, aleCazoo
musiałem wrócićbar
. w tej sytuacji proponowaneMatchers.any()
rozwiązanie nie działa, jednakMatchers.isA()
działa idealnie.org.mockito.Matchers
jest teraz przestarzałe - użyjorg.mockito.ArgumentMatchers
zamiast tego, tj.import static org.mockito.ArgumentMatchers.*
(patrz dokumenty )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Użyj w ten sposób:
Zanim będziesz musiał zaimportować
Mockito.Matchers
źródło
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
powinien pasować do twoich potrzeb.Ponadto zawsze możesz rozważyć wdrożenie
hashCode()
iequals()
dlaBazoo
klasy. To sprawi, że twój przykład kodu będzie działał tak, jak chcesz.źródło
Inną opcją jest poleganie na dobrej starej
equals
metodzie mody . Dopóki argument wwhen
makiecieequals
jest argumentem w testowanym kodzie, Mockito będzie pasował do makiety.Oto przykład.
zakładając, że wiesz, jaka będzie wartość
someField
, możesz wyśmiewać to w ten sposób.plusy: jest to bardziej wyraźne niż
any
dobijacze. Jako recenzent kodu, mam oko naany
kod, który piszą młodsi programiści, gdy przegląda logikę swojego kodu, aby wygenerować odpowiedni przekazywany obiekt.con: Czasami pole przekazywane do obiektu jest losowym identyfikatorem. W tym przypadku nie można łatwo zbudować oczekiwanego obiektu argumentu w kodzie próbnym.
Innym możliwym podejściem jest użycie
Answer
obiektu Mockito, którego można użyć z tąwhen
metodą.Answer
pozwala przechwycić rzeczywiste wywołanie, sprawdzić argument wejściowy i zwrócić próbny obiekt. W poniższym przykładzie używamany
do przechwycenia dowolnego żądania wyśmiewanej metody. Ale wAnswer
lambda mogę dalej sprawdzić argument Bazo ... może w celu zweryfikowania, czy przekazano mu odpowiedni identyfikator. Wolę to nadany
sobą, aby przynajmniej przeprowadzić kontrolę argumentu.Podsumowując, lubię polegać na
equals
(gdzie oczekiwany argument i rzeczywisty argument powinny być sobie równe) i jeśli równość nie jest możliwa (z powodu niemożności przewidzenia rzeczywistego stanu argumentu), ucieknę się doAnswer
wglądu do argumentu.źródło