Mockito.any() pasar interfaz con genéricos

4 minutos de lectura

avatar de usuario
lrxw

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

La interfaz:

public interface AsyncCallback<T>

En mi método de prueba:

Mockito.any(AsyncCallback.class)

Poniendo <ResponseX> detrás o para .class no funcionó

avatar de usuario
suave

Hay una forma de tipo seguro: use ArgumentMatchers.any() y calificarlo con el tipo:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

  • Confirmo que esta respuesta funciona y suprime correctamente la advertencia.

    – Kevinarpe

    17 de marzo de 2014 a las 12:51

  • Esto no es realmente más seguro ya que el método real solo se puede llamar con el argumento escrito correctamente de todos modos. Solo era necesario satisfacer al compilador pre-java8 que carecía de este tipo de inferencia de tipos.

    – Germán

    17 de diciembre de 2014 a las 11:36


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

    – pierrefevrier

    4 de agosto de 2017 a las 13:19


  • Matchers en realidad está en desuso, pero ArgumentMatchers funcionó

    – guijob

    14 de diciembre de 2017 a las 21:56

  • ArgumentMatchers.<List<S8Z2DETNSGDto>>any() – IDE me sugiere que se pueden inferir argumentos de tipo explícito. Significa que no hay ningún requisito para definir explícitamente tipos y ArgumentMatchers.any() tendrá el mismo resultado

    – Alex

    9 de septiembre de 2019 a las 9:11

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

  • no lo haría any() juego AsyncCallback<AnyOtherType> ¿también?

    – Mateo Lee

    3 oct 2016 a las 15:32

  • Me pregunto acerca de una situación en la que el tipo de argumento también es genérico, pero solo desea simularlo para un tipo concreto (o simularlo para varios tipos de diferentes maneras). Dado when(x.y(any())).thenAnswer(...) por ejemplo, donde y es 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?

    – Mateo Lee

    3 oct 2016 a las 18:04

  • @MatthewRead Debido al borrado, Mockito no puede verificar el tipo real en tiempo de ejecución. Así que ni siquiera puedes usar isA(). Si el objeto tiene una Class objeto correspondiente al tipo, y la interfaz expone esto, supongo que podría verificarlo en un comparador personalizado. O por ejemplo en el caso de un Collection se puede comprobar el tipo de los elementos.

    – Germán

    3 oct 2016 a las 22:05


  • Matchers fue reemplazado por ArgumentMatchers en Mockito v2

    – bheussler

    24 de junio de 2017 a las 3:44

  • @YuraHoy Aquí no se realiza ninguna verificación de tipo de tiempo de ejecución, incluso antes de la versión 8. El tipo tuvo que agregarse solo para satisfacer al compilador. Ahora el compilador infiere el tipo de la firma del método. Ver docs.oracle.com/javase/tutorial/java/generics/…

    – Germán

    19 de noviembre de 2020 a las 10:32

Tuve que adoptar el siguiente mecanismo para permitir genéricos:

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

Espero que esto ayude a alguien.

  • Vea mi respuesta: esto ya no es necesario con Java 8.

    – Germán

    17 de diciembre de 2014 a las 11:37

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

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

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 devolución permitía la inferencia:

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

avatar de usuario
sala de garrett

Simplemente puede emitirlo, 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)

avatar de usuario
Gagarwa

Tuve un problema similar usando 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 múltiples tipos, como Sort y Iterable. También puedes usar Mockito.any(Example.class) por supuesto con el tipo advertencia de seguridad.

  • Era mi problema también. Generalmente uso una importación estática para org.mockito.Mockito.*, pero en este caso solo se puede usar el método when() sin calificación, el método any() necesita la calificación.

    – Geza

    13 de enero de 2021 a las 11:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad