从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
问题是编译器将推断为 返回值类型 。Mockito 不会意识到这一点(由于类型擦除),并返回引用类型的默认值,即 。运行时将尝试在将 null 返回值传递给 之前调用该返回值的方法,从而取消其装箱,并引发异常。Integer
any()
null
intValue
doStuff