Mockito bietet:
when(mock.process(Matchers.any(List.class)));
Wie vermeide ich eine Warnung, wenn stattdessen process
eine genommen List<Bar>
wird?
Für Java 8 und höher ist es einfach:
when(mock.process(Matchers.anyList()));
Für Java 7 und niedriger benötigt der Compiler etwas Hilfe. Verwendung anyListOf(Class<T> clazz)
:
when(mock.process(Matchers.anyListOf(Bar.class)));
anyListOf
. Obwohl esanyList
funktioniert, gibt es eine Warnung aus.anyListOf
ist veraltet, daher ist es besser, es NICHT zu verwenden. Beispiel für Java 8 funktioniert nicht im Falle einer Methodenüberladung, zum Beispiel, wenn Sie eine Methode haben, die 2 verschiedene Listen akzeptiert:List<DBEntity>
undList<DTO>
ich habe dieses ProblemArgumentMatchers
mit generic gelöst :when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
Darüber hinaus
anyListOf
können Sie Generika immer explizit mit dieser Syntax angeben:Java 8 ermöglicht neu die Typinferenz basierend auf Parametern. Wenn Sie also Java 8 verwenden, funktioniert dies möglicherweise auch:
Denken Sie daran , dass weder
any()
nochanyList()
werden alle Kontrollen gelten, einschließlich des Typs oder null überprüft. In Mockito 2.xany(Foo.class)
wurde geändert, um "beliebigesinstanceof
Foo" zu bedeuten ,any()
bedeutet aber immer noch "beliebiger Wert einschließlichnull
".HINWEIS: In den neueren Versionen von Mockito wurde auf ArgumentMatchers umgestellt , um eine Namenskollision mit zu vermeiden
org.hamcrest.Matchers
. Ältere Versionen von Mockito müssenorg.mockito.Matchers
wie oben verwendet werden.quelle
Matchers.any()
ist sehr praktisch!Vor Java 8 (Versionen 7 oder 6) verwende ich die neue Methode ArgumentMatchers.anyList:
import static org.mockito.Mockito.*; import org.mockito.ArgumentMatchers; verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
quelle