Mockito: Lista de coincidencias con genéricos

Respuestas:

279

Para Java 8 y superior, es fácil:

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

Para Java 7 y versiones inferiores, el compilador necesita un poco de ayuda. Uso anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
artbristol
fuente
16
Nota: esto está en desuso en Mockito 2. * y se eliminará en Mockito 3. En desuso porque el compilador de Java 8 puede inferir el tipo ahora.
Kip
@artbristol, ¿sabe si con anySet () debería funcionar igual que anyList ()? Estoy en Java 8 y aparece una advertencia en Eclipse IDE
Fernando Fradegrada
1
Mejor de usar anyListOf. Aunque anyListfunciona, emite una advertencia.
balki
3
anyListOfestá en desuso, por lo que es mejor NO usarlo. Ejemplo para Java 8 no funciona en caso de sobrecarga de métodos, por ejemplo, si tiene un método que acepta 2 listas diferentes: List<DBEntity>y List<DTO>he resuelto este problema usando ArgumentMatchersgenéricos:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

Además de lo anyListOfanterior, siempre puede especificar genéricos explícitamente utilizando esta sintaxis:

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

Java 8 recientemente permite la inferencia de tipos basada en parámetros, por lo que si está utilizando Java 8, esto también puede funcionar:

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

Recuerde que any()ni anyList()aplicará ningún cheque, incluidos los cheques de tipo o nulos. En Mockito 2.x, any(Foo.class)se cambió para significar "cualquier instanceofFoo", pero any()aún significa "cualquier valor incluido null".

NOTA: Lo anterior se ha cambiado a ArgumentMatchers en versiones más recientes de Mockito, para evitar una colisión de nombres con org.hamcrest.Matchers. Las versiones anteriores de Mockito deberán seguir usándose org.mockito.Matcherscomo se indicó anteriormente.

Jeff Bowman
fuente
44
Matchers.any()es muy conveniente!
MBach
Matchers ahora está en desuso, aquí está la información de mockito "Use ArgumentMatchers. Esta clase ahora está en desuso para evitar un choque de nombres con Hamcrest org.hamcrest.Matchers. Esta clase probablemente se eliminará en la versión 3.0". static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Cambios realizados.
Jeff Bowman
5

Antes de Java 8 (versiones 7 o 6) utilizo el nuevo método ArgumentMatchers.anyList:

import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Miguel R. Santaella
fuente