Desde Java 8 puede usar el any
método sin argumentos y el compilador inferirá el argumento de tipo:
verify(bar).doStuff(any());
Explicación
Lo nuevo en Java 8 es que el tipo de destino de una expresión se usará 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 en general mejora las inferencias de tipos.
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 valor de retorno de any()
. Mockito no se dará cuenta de esto (debido a la eliminación de tipo) 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
método antes de pasarlo doStuff
, y se genera la excepción.
any
método debería funcionar. ¡No buscas respuestas para cosas que simplemente funcionan!