Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mockito';“s通用”;任何();方法_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

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;