小编典典

使用 Mockito 的通用“any()”方法

all

我有一个接口,该接口需要一个数组Foo

public interface IBar {
  void doStuff(Foo[] arr);
}

我正在使用 Mockito 模拟这个接口,我想断言它doStuff()被调用,但我不想验证传递了什么参数 - “不在乎”。

如何使用any()通用方法而不是编写以下代码anyObject()

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

阅读 110

收藏
2022-06-16

共1个答案

小编典典

从 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

问题是编译器会推断Integerany(). Mockito 不会意识到这一点(由于类型擦除)并返回引用类型的默认值,即null.
运行时将尝试通过在将 null 返回值intValue传递给之前调用其上的方法来拆箱doStuff,并引发异常。

2022-06-16