从 Java 8 开始,您可以使用无参数any
方法,并且类型参数将由编译器推断:
verify(bar).doStuff(any());
解释
Java 8 中的新功能是表达式的目标类型将用于推断其子表达式的类型参数。在 Java 8 之前,只有用于类型参数推断的方法的参数(大部分时间)。
在这种情况下,参数类型doStuff
将是 的目标类型any()
,并且返回值类型any()
将被选择以匹配该参数类型。
添加此机制主要是为了能够编译 lambda 表达式,但它总体上改进了类型推断。
原始类型
不幸的是,这不适用于原始类型:
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
问题是编译器会推断Integer
为any()
. Mockito 不会意识到这一点(由于类型擦除)并返回引用类型的默认值,即null
. 运行时将尝试通过在将返回值intValue
传递给之前调用其上的方法来拆箱doStuff
,并引发异常。