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

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

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

我正在嘲笑这个接口使用Mockito,我想断言doStuff()被调用,但我不想validation什么parameter passing – “不关心”。

如何使用any() ,generics方法而不是anyObject()来编写以下代码?

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

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

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

说明

Java 8中的新事物是,将使用expression式的目标types来推断其子expression式的types参数。 在Java 8之前,只有用于types参数推断(大部分时间)的方法的参数。

在这种情况下, doStuff的参数types将是any()的目标types, any()的返回值types将被select为匹配该参数types。


原始types

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

 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不会意识到这一点(由于types擦除)并返回默认值为null引用types。 运行时将尝试通过调用intValue方法来解除返回值,并抛出exception。

这应该工作

 import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; verify(bar).DoStuff(any(Foo[].class)); 

你可以使用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更新过)使用这个特性,为了让用户(已经使用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版中被删除。