211

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

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

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

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

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

4 回答 4

285

这应该工作

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));
于 2009-11-22T13:59:35.443 回答
133

从 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. 运行时将尝试通过在将返回值intValue传递给之前调用其上的方法来拆箱doStuff,并引发异常。

于 2015-06-17T08:19:59.910 回答
13

您可以Mockito.isA()为此使用:

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)

于 2015-08-31T12:00:18.377 回答
11

由于我需要在我的最新项目中使用此功能(有时我们从 1.10.19 更新),只是为了让用户(已经在使用mockito-core 版本 2.1.0 或更高版本)保持最新,静态上述答案中的方法应取自ArgumentMatchers类:

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

如果您计划从版本 3 开始使您的 Mockito 人工制品保持最新,请记住这一点,此类可能不再存在:

根据 2.1.0 及更高版本,org.mockito.Matchers 的 Javadoc 声明:

使用org.mockito.ArgumentMatchers. 此类现在已弃用,以避免与 Hamcrest *org.hamcrest.Matchers 类发生名称冲突。此类可能会在 3.0 版中被删除。

如果您想进一步阅读,我已经写了一篇关于模拟通配符的小文章。

于 2017-02-17T12:31:55.160 回答