使用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