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

时间:2009-11-22 13:50:00

标签: java unit-testing mocking mockito

我有一个接口,其方法需要一个Foo数组:

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

我正在使用Mockito嘲笑这个界面,我想声明doStuff()被调用,但我不想验证传递了什么参数 - “不关心”。

如何使用any()(通用方法)代替anyObject()来编写以下代码?

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

4 个答案:

答案 0 :(得分:261)

这应该有效

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

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

答案 1 :(得分:87)

从Java 8开始,您可以使用无参数any方法,并且编译器会推断出type参数:

verify(bar).doStuff(any());

解释

Java 8中的新功能是表达式的target type将用于推断其子表达式的类型参数。在Java 8之前,只有用于类型参数推断的方法的参数(大多数时候)。

在这种情况下,doStuff的参数类型将是any()的目标类型,并且将选择返回值类型any()以匹配该参数类型。

原始类型

不幸的是,这不适用于原始类型:

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,并抛出异常。

答案 2 :(得分:10)

您可以使用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)

答案 3 :(得分:3)

因为我需要将此功能用于我的最新项目(我们从1.10.19更新了一次),只是为了保留用户(已经使用 mockito-core版本2.1.0或更高版本< / strong>)最新,上述答案中的静态方法应取自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版中删除。