我有一个接口,该接口需要一个数组Foo:
Foo
public interface IBar { void doStuff(Foo[] arr); }
我正在使用 Mockito 模拟这个接口,我想断言它doStuff()被调用,但我不想验证传递了什么参数 - “不在乎”。
doStuff()
如何使用any()通用方法而不是编写以下代码anyObject()?
any()
anyObject()
IBar bar = mock(IBar.class); ... verify(bar).doStuff((Foo[]) anyObject());
从 Java 8 开始,您可以使用无参数any方法,并且类型参数将由编译器推断:
any
verify(bar).doStuff(any());
Java 8 中的新功能是表达式的 目标类型 将用于推断其子表达式的类型参数。在 Java 8 之前,只有用于类型参数推断的方法的参数(大部分时间)。
在这种情况下,参数类型doStuff将是 的目标类型any(),并且返回值类型any()将被选择以匹配该参数类型。
doStuff
添加此机制主要是为了能够编译 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. 运行时将尝试通过在将 null 返回值intValue传递给之前调用其上的方法来拆箱doStuff,并引发异常。
Integer
null
intValue