Mockito: List Matchers mit Generika

170

Mockito bietet:

when(mock.process(Matchers.any(List.class)));

Wie vermeide ich eine Warnung, wenn stattdessen processeine genommen List<Bar>wird?

Philippe Blayo
quelle

Antworten:

285

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)));
Artbristol
quelle
17
Hinweis: Dies ist in Mockito 2 veraltet. * Und wird in Mockito 3 entfernt. Veraltet, da der Java 8-Compiler jetzt auf den Typ schließen kann.
Kip
@artbristol weißt du, ob mit anySet () genauso funktionieren soll wie mit anyList ()? Ich bin in Java 8 und eine Warnung wird in Eclipse IDE
Fernando Fradegrada
1
Besser zu benutzen anyListOf. Obwohl es anyListfunktioniert, gibt es eine Warnung aus.
Balki
4
anyListOfist 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>und List<DTO>ich habe dieses Problem ArgumentMatchersmit generic gelöst :when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

Darüber hinaus anyListOfkönnen Sie Generika immer explizit mit dieser Syntax angeben:

when(mock.process(Matchers.<List<Bar>>any(List.class)));

Java 8 ermöglicht neu die Typinferenz basierend auf Parametern. Wenn Sie also Java 8 verwenden, funktioniert dies möglicherweise auch:

when(mock.process(Matchers.any()));

Denken Sie daran , dass weder any()noch anyList()werden alle Kontrollen gelten, einschließlich des Typs oder null überprüft. In Mockito 2.x any(Foo.class)wurde geändert, um "beliebiges instanceofFoo" zu bedeuten , any()bedeutet aber immer noch "beliebiger Wert einschließlich null".

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üssen org.mockito.Matcherswie oben verwendet werden.

Jeff Bowman
quelle
4
Matchers.any()ist sehr praktisch!
MBach
Matchers ist jetzt veraltet. Hier sind die Informationen von mockito "Use ArgumentMatchers. Diese Klasse ist jetzt veraltet, um einen Namenskonflikt mit der Hamcrest org.hamcrest.Matchers-Klasse zu vermeiden. Diese Klasse wird wahrscheinlich in Version 3.0 entfernt." static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Änderungen vorgenommen.
Jeff Bowman
5

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());
Miguel R. Santaella
quelle