使用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版中被删除。