Od wersji Java 8 można używać metody bez argumentów any
, a argument typu zostanie wyprowadzony przez kompilator:
verify(bar).doStuff(any());
Wyjaśnienie
Nowością w Javie 8 jest to, że docelowy typ wyrażenia będzie używany do wnioskowania o parametrach typu jego podwyrażeń. Przed Java 8 tylko argumenty metod były używane do wnioskowania o parametrach typu (przez większość czasu).
W takim przypadku typ parametru doStuff
będzie typem docelowym any()
, a typ wartości zwracanej any()
zostanie wybrany tak, aby pasował do tego typu argumentu.
Mechanizm ten został dodany w Javie 8 głównie w celu kompilacji wyrażeń lambda, ale ogólnie poprawia wnioskowania typu.
Typy pierwotne
To nie działa z typami pierwotnymi, niestety:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Problem polega na tym, że kompilator będzie wnioskować Integer
jako wartość zwracana any()
. Mockito nie będzie tego świadomy (z powodu kasowania typu) i zwróci domyślną wartość dla typów referencyjnych, tj null
. Środowisko wykonawcze spróbuje rozpakować wartość zwracaną przez wywołanie intValue
metody przed przekazaniem jej doStuff
, a wyjątek zostanie zgłoszony.
any
metoda powinna po prostu działać. Nie szukasz odpowiedzi na rzeczy, które po prostu działają!any()
ale było w porządkuanyBoolean()
, co pięknie pokazuje ostatnia część twojej odpowiedzi.To powinno działać
źródło
verify(bar).DoStuff(any[Array[Foo]])
Możesz użyć
Mockito.isA()
do tego:http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)
źródło
Ponieważ musiałem korzystać z tej funkcji w moim najnowszym projekcie (w pewnym momencie zaktualizowaliśmy wersję 1.10.19), po to tylko, aby użytkownicy (którzy już używają wersji mockito-core 2.1.0 lub nowszej ) byli na bieżąco, statycznie metody z powyższych odpowiedzi należy pobrać z
ArgumentMatchers
klasy:Pamiętaj o tym, jeśli planujesz aktualizować swoje artefakty Mockito, ponieważ prawdopodobnie począwszy od wersji 3, ta klasa może już nie istnieć:
Zgodnie z 2.1.0 i nowszymi Javadoc z org.mockito.Matchers stwierdza:
Napisałem mały artykuł na temat symboli wieloznacznych mockito, jeśli jesteś gotowy na dalsze czytanie.
źródło