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

回到顶部