Después de investigar con expertos en el tema, programadores de diversas áreas y profesores dimos con la solución al problema y la compartimos en este post.
Solución:
Esto debería funcionar
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
verify(bar).DoStuff(any(Foo[].class));
Desde Java 8 puedes usar el argumento sin argumentos any
El método y el argumento de tipo serán deducidos por el compilador:
verify(bar).doStuff(any());
Explicación
Lo nuevo en Java 8 es que el tipo de objetivo de una expresión se utilizará para inferir los parámetros de tipo de sus subexpresiones. Antes de Java 8, solo los argumentos de los métodos se usaban para la inferencia de parámetros de tipo (la mayoría de las veces).
En este caso, el tipo de parámetro de doStuff
será el tipo de destino para any()
y el tipo de valor de retorno de any()
será elegido para que coincida con ese tipo de argumento.
Este mecanismo se agregó en Java 8 principalmente para poder compilar expresiones lambda, pero mejora las inferencias de tipos en general.
tipos primitivos
Esto no funciona con tipos primitivos, desafortunadamente:
public interface IBar
void doPrimitiveStuff(int i);
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
El problema es que el compilador inferirá Integer
como el tipo de valor de retorno de any()
. Mockito no se dará cuenta de esto (debido al borrado de tipos) y devolverá el valor predeterminado para los tipos de referencia, que es null
. El tiempo de ejecución intentará desempaquetar el valor de retorno llamando al intValue
en él antes de pasarlo a doStuff
y se lanza la excepción.
Puedes usar Mockito.isA()
para eso:
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;
verify(bar).doStuff(isA(Foo[].class));
http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)
valoraciones y reseñas
Tienes la opción de añadir valor a nuestro contenido informacional asistiendo con tu veteranía en las crónicas.