¿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ó
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ó
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();
}
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)
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