Mockito.any () interfaz de paso con genéricos

170

¿Es posible pasar el tipo de interfaz con genéricos?

La interfaz:

public interface AsyncCallback<T>

En mi método de prueba:

Mockito.any(AsyncCallback.class)

Poner <ResponseX>detrás o no .classfuncionó.

lrxw
fuente

Respuestas:

306

Hay una forma segura de tipo: utilícela ArgumentMatchers.any()y califíquela con el tipo:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()
thSoft
fuente
44
Confirmo que esta respuesta funciona y suprime correctamente la advertencia.
kevinarpe
1
Esto no es realmente más seguro ya que el método real solo se puede llamar con el argumento correctamente escrito de todos modos. Solo era necesario satisfacer el compilador pre-java8 que carecía de este tipo de inferencia de tipos.
herman
Utilicé algo como esto ResponseEntity <List <Map <String, Object >>> responseEntity = Matchers. <ResponseEntity <List <Map <String, Object >>>> any (); Y siempre vuelve nulo
Arun
66
Con nuevas versiones de Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier
15
Matchersen realidad está en desuso, pero ArgumentMatchersfuncionó.
guijob
67

Con Java 8, simplemente puede usar any()(suponiendo importación estática) sin argumento o parámetro de tipo debido a la inferencia de tipo mejorada. El compilador ahora sabe por el tipo de destino (el tipo de argumento del método) lo que realmente quiere decir Matchers.<AsyncCallback<ResponseX>>any(), que es la solución anterior a Java 8.

Germán
fuente
¿No any()coincidiría AsyncCallback<AnyOtherType>tan bien?
Mateo leyó el
@MatthewRead Using AsyncCallback<AnyOtherType>ni siquiera debería compilar si el tipo de argumento es 'AsyncCallback <ResponseX>'.
herman
1
Me pregunto sobre una situación en la que el tipo de argumento también es genérico, pero solo desea burlarse de un tipo concreto (o burlarse de varios tipos de diferentes maneras). Dado when(x.y(any())).thenAnswer(...)por ejemplo, dónde yestá public <T> T y(AsyncCallback<T> arg). Quizás sería mejor verificar el tipo en la respuesta, si eso es lo que se necesita.
Matthew leyó el
2
@MatthewRead Debido a la eliminación, Mockito no puede verificar el tipo real en tiempo de ejecución. Entonces ni siquiera puedes usar isA(). Si el objeto contiene un Classobjeto correspondiente al tipo, y la interfaz lo expone, supongo que podría verificarlo en un comparador personalizado. O, por ejemplo, en el caso de Collectionque pueda comprobar el tipo de los elementos.
herman
1
Matchersfue reemplazado por ArgumentMatchersen Mockito v2
bheussler
15

Tuve que adoptar el siguiente mecamismo para permitir los genéricos:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Espero que esto ayude a alguien.

el juguete
fuente
3
Vea mi respuesta: esto ya no es necesario con Java 8.
herman
5

Publicar un comentario de pierrefevrier como respuesta, lo que podría ser útil si se presenta en una respuesta en lugar de comentarios.

Con nuevas versiones de Mockito: (Matchers.<AsyncCallback<ResponseX>>any()

hundimiento
fuente
1
agregué su comentario a la respuesta original
Joergi el
2

Además de la respuesta de thSoft, poner la llamada calificada a any () en el método significaba que podía eliminar la calificación ya que el tipo de retorno permitía la inferencia:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}
JWGS
fuente
0

Puede lanzarlo, agregando advertencias de supresión si lo desea:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

Si Java permitiera genéricos 'genéricos', podrían tener un método como este, que es lo que está buscando

private static <T, E> T<E> mock(Class<T<E>> clazz)
Garrett Hall
fuente
Cuando intenté esto, recibí un error en mi prueba:You cannot use argument matchers outside of verification or stubbing.
kevinarpe
No es una buena idea usar @SuppressWarnings: pre-java 8, si fuera a asignarlo a una variable separada, podría usarlo any()como en la respuesta de INtoy. Ahora con Java 8, any()se puede usar en línea sin la necesidad de una asignación por separado.
herman
@kevinarpe si tiene múltiples coincidencias de argumentos, se deben invocar en orden como lo especifica el lenguaje Java.
TWiStErRob
0

Tuve un problema similar al usar Spring Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Aquí, debe usar la calificación, el método b / c findAll puede tomar varios tipos, como Sorty Iterable. También puede utilizar, Mockito.any(Example.class)por supuesto, con el tipo de advertencia de seguridad.

Gagarwa
fuente