使用Mockito的通用“ any()”方法
我有一个接口,该方法需要一个数组Foo:
public interface IBar { void doStuff(Foo[] arr);
}
我正在使用Mockito嘲笑此接口,我想断言该接口已doStuff()被调用,但是我不想验证传递了什么参数-“无关”。
如何使用any()通用方法代替编写以下代码anyObject()?
IBar bar = mock(IBar.class);...
verify(bar).doStuff((Foo[]) anyObject());
回答:
从Java 8开始,您可以使用无参数any方法,并且类型参数将由编译器推断:
verify(bar).doStuff(any());说明
Java 8中的新事物是表达式的
目标类型
将用于推断其子表达式的类型参数。在Java 8之前,仅在大多数情况下用于类型参数推断的方法的参数。
在这种情况下,的参数类型doStuff将是的目标类型any(),并且any()将选择的返回值类型以匹配该参数类型。
此机制主要是在Java 8中添加的,目的是能够编译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,并引发异常。
以上是 使用Mockito的通用“ any()”方法 的全部内容, 来源链接: utcz.com/qa/431678.html

