为什么在 Mockito 中不可能同时使用 Mathers 和值参数



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()为每个方法参数查找匹配器。

相关内容

  • 没有找到相关文章

最新更新