Answers:
从Java 8开始,您可以使用无参数any
方法,并且类型参数将由编译器推断:
verify(bar).doStuff(any());
Java 8中的新事物是,表达式的目标类型将用于推断其子表达式的类型参数。在Java 8之前,(大多数时候)仅用于方法的参数用于类型参数推断。
在这种情况下,的参数类型doStuff
将是的目标类型any()
,并且any()
将选择的返回值类型以匹配该参数类型。
此机制主要是在Java 8中添加的,目的是能够编译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
。在将返回值intValue
传递给之前,运行时将尝试通过调用返回值的方法来取消对返回值的装箱doStuff
,并引发异常。
any()
但是可以使用anyBoolean()
,您的答案的最后一部分很清楚地说明了这一点。
这应该工作
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
verify(bar).DoStuff(any(Foo[].class));
verify(bar).DoStuff(any[Array[Foo]])
您可以使用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)
由于我需要在我的最新项目中使用此功能(有一点我们从1.10.19进行了更新),只是为了使用户(已经在使用模仿核心版本2.1.0或更高版本)保持最新,因此上述答案中的方法应从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版中删除。
如果您打算进一步阅读,我已经写了一篇关于模拟通配符的文章。
any
方法应该可以正常工作。您不会查找仅能正常工作的答案!