Desde o Java 8, você pode usar o any
método sem argumento e o argumento type será inferido pelo compilador:
verify(bar).doStuff(any());
Explicação
A novidade no Java 8 é que o tipo de destino de uma expressão será usado para inferir parâmetros de tipo de suas subexpressões. Antes do Java 8, apenas argumentos para métodos eram usados para inferência de parâmetro de tipo (na maioria das vezes).
Nesse caso, o tipo de parâmetro de doStuff
será o tipo de destino any()
e o tipo de valor de retorno any()
será escolhido para corresponder a esse tipo de argumento.
Esse mecanismo foi adicionado no Java 8 principalmente para poder compilar expressões lambda, mas melhora as inferências de tipo em geral.
Tipos primitivos
Isso não funciona com tipos primitivos, infelizmente:
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
O problema é que o compilador inferirá Integer
como o valor de retorno de any()
. O Mockito não estará ciente disso (devido ao apagamento do tipo) e retornará o valor padrão para os tipos de referência, que é null
. O tempo de execução tentará desmarcar o valor de retorno chamando o intValue
método antes de passá-lo para doStuff
, e a exceção será lançada.
any
método deveria funcionar. Você não procura respostas para coisas que simplesmente funcionam!