Mockito官方文档 说:
警告:
如果使用参数匹配器,则必须提供所有参数由匹配器。
例如:(示例显示验证,但同样适用于存根):
verify(mock).someMethod(anyInt(), anyString(), eq("third argument")); //above is correct - eq() is also an argument matcher verify(mock).someMethod(anyInt(), anyString(), "third argument"); //above is incorrect - exception will be thrown because third argument is given without argument matcher.
像
anyObject()
这样的匹配器方法eq()
不返回匹配器。在内部,他们记录 堆栈上的匹配器并返回一个虚拟值(通常为 null)。
我很好奇为什么即使类似any()
方法返回null
,也无法将Mathers
与值一起使用。
文档说
像anyObject(),eq()这样的匹配器方法不返回匹配器。 在内部,它们在堆栈上记录匹配器并返回虚拟值 (通常为空)。此实现是由于静态类型安全 由 Java 编译器强加。结果是你不能使用 anyObject(), eq() 方法在 verified/stubbed 方法之外。
莫基托依靠这种可以说是黑魔法。如果您能够传递对象,Mockito 必须能够理解 null 何时是实际参数,何时是匹配器调用。几乎,这两种情况是无法区分的(我假设):
verify(mock).someMethod(anyInt(), anyString(), null);
verify(mock).someMethod(anyInt(), null, anyString());
一个很好的猜测是,mockito需要为OngoingStubbing
中的所有参数找到参数匹配器。InArgumentMatcherStorageImpl#validateState()
为每个方法参数查找匹配器。