¿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 .class
funcionó.
Hay una forma segura de tipo: utilícela ArgumentMatchers.any()
y califíquela con el tipo:
ArgumentMatchers.<AsyncCallback<ResponseX>>any()
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
en realidad está en desuso, peroArgumentMatchers
funcionó.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 decirMatchers.<AsyncCallback<ResponseX>>any()
, que es la solución anterior a Java 8.fuente
any()
coincidiríaAsyncCallback<AnyOtherType>
tan bien?AsyncCallback<AnyOtherType>
ni siquiera debería compilar si el tipo de argumento es 'AsyncCallback <ResponseX>'.when(x.y(any())).thenAnswer(...)
por ejemplo, dóndey
está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.isA()
. Si el objeto contiene unClass
objeto correspondiente al tipo, y la interfaz lo expone, supongo que podría verificarlo en un comparador personalizado. O, por ejemplo, en el caso deCollection
que pueda comprobar el tipo de los elementos.Matchers
fue reemplazado porArgumentMatchers
en Mockito v2Tuve que adoptar el siguiente mecamismo para permitir los genéricos:
Espero que esto ayude a alguien.
fuente
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()
fuente
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:
fuente
Puede lanzarlo, agregando advertencias de supresión si lo desea:
Si Java permitiera genéricos 'genéricos', podrían tener un método como este, que es lo que está buscando
fuente
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pre-java 8, si fuera a asignarlo a una variable separada, podría usarloany()
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.Tuve un problema similar al usar Spring
Example
:Aquí, debe usar la calificación, el método b / c findAll puede tomar varios tipos, como
Sort
yIterable
. También puede utilizar,Mockito.any(Example.class)
por supuesto, con el tipo de advertencia de seguridad.fuente