Java 使用Mockito';“s通用”;任何();方法
我有一个方法接口,该方法需要一个Java 使用Mockito';“s通用”;任何();方法,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我有一个方法接口,该方法需要一个Foo数组: public interface IBar { void doStuff(Foo[] arr); } 我正在使用Mockito模拟这个接口,我想断言调用了doStuff(),但我不想验证传递的参数——“不在乎” 如何使用通用方法any(),而不是anyObject(),编写以下代码 这应该行得通 import static org.mockito.ArgumentMatchers.any; import static org.mockito.M
Foo
数组:
public interface IBar {
void doStuff(Foo[] arr);
}
我正在使用Mockito模拟这个接口,我想断言调用了doStuff()
,但我不想验证传递的参数——“不在乎”
如何使用通用方法any()
,而不是anyObject()
,编写以下代码
这应该行得通
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
verify(bar).DoStuff(any(Foo[].class));
由于Java 8,您可以使用参数较少的
任何方法,并且类型参数将由编译器推断:
verify(bar).doStuff(any());
解释
Java8中的新功能是使用表达式的类型来推断其子表达式的类型参数。在Java8之前,只有用于类型参数推断的方法的参数(大多数情况下)
在这种情况下,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
方法尝试取消对返回值的绑定,然后抛出异常。您可以使用Mockito.isA()
:
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;
verify(bar).doStuff(isA(Foo[].class));
由于我需要在我的最新项目中使用此功能(有一次我们从1.10.19更新),为了让用户(已经在使用mockito core 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版中删除
我写了一篇关于if you's up for detain的小文章。以防万一Scala中有人需要它:verify(bar).DoStuff(any[Array[Foo]])
我在导入时遇到了问题,我在导入时使用了hamcrest的any(),它与mockito的发生了冲突。请查看API,类参数仅用于强制转换,该方法仍然接受任何类型的对象。在这种情况下使用isA()。该类现在已被弃用,以避免与Hamcrest的名称冲突。使用org.mockito.argumentmatchers这是正确的答案。使用any(Clazz)是完全错误的。@surasintanchareon实际上,any(Class)只是isA(Class)的别名(参见文档)。所以这一点都没有错。isA不受欢迎。如何在Scala中导入org.mockito.ArgumentMatcher?我尝试导入org.mockito.ArgumentMatcher.any我得到错误`值any不是object org.mockito.ArgumentMatcher的成员你能告诉我3.0版中的等价物是什么吗?一旦发布,我们就会知道;)每当这个答案获得赞成票时,我都感到惊喜!我猜想,自Java8以来,这个问题不会引起太多关注,因为any
方法应该可以正常工作。你不需要为那些只起作用的事情寻找答案!我来这里是因为我不知道为什么我的代码不能与any()
一起使用,但与anyBoolean()
一起使用是可以的,您的答案的最后一部分很好地说明了这一点。
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;