我有一个接口,其方法需要一个Foo
数组:
public interface IBar {
void doStuff(Foo[] arr);
}
我正在使用Mockito嘲笑这个界面,我想声明doStuff()
被调用,但我不想验证传递了什么参数 - “不关心”。
如何使用any()
(通用方法)代替anyObject()
来编写以下代码?
IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
答案 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版中删除。