我有一个接口的方法,期望一个Foo数组:

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

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

我如何编写以下代码使用任何(),泛型方法,而不是anyObject()?

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

当前回答

因为我需要在我的最新项目中使用这个特性(在某个时候我们从1.10.19更新),只是为了让用户(已经在使用模拟内核2.1.0或更高版本的用户)保持最新,来自上述答案的静态方法应该从ArgumentMatchers类中获取:

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

请记住这一点,如果你打算保持你的Mockito工件最新,可能从版本3开始,这个类可能不再存在:

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

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

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

其他回答

你可以使用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 (. lang . class)

因为我需要在我的最新项目中使用这个特性(在某个时候我们从1.10.19更新),只是为了让用户(已经在使用模拟内核2.1.0或更高版本的用户)保持最新,来自上述答案的静态方法应该从ArgumentMatchers类中获取:

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

请记住这一点,如果你打算保持你的Mockito工件最新,可能从版本3开始,这个类可能不再存在:

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

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

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

从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

问题是编译器将推断Integer为any()的返回值类型。Mockito将不会意识到这一点(由于类型擦除),并返回引用类型的默认值,即null。运行时将尝试在将空返回值传递给doStuff之前调用它的intValue方法来解箱,并抛出异常。

这应该可以

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

verify(bar).DoStuff(any(Foo[].class));