我正在 mockito 中创建自定义参数匹配器。使用this示例:
class IsListOfTwoElements extends ArgumentMatcher<List> {
public boolean matches(Object list) {
return ((List) list).size() == 2;
}
}
这让我想知道为什么参数list
的类型是Object
而不是List
。
传递给匹配函数的参数可以是别的东西吗?如果是这样的话,这个例子不应该检查参数的类型并在它不是 List
时返回 false
吗?
稍微改一下问题:
mockito 是否 promise 只将正确的类型传递给 matches
函数?如果是这样,为什么不使用泛型类型。如果不是,如果传递给它的错误类型为什么不返回 false?
最佳答案
- 如果扩展
ArgumentMatcher
,您将收到一个对象,您有责任转换它。 Mockito 会根据类名来描述。 - 如果扩展
BaseMatcher
,您将收到一个对象,您有责任转换它。描述只会说明传递给匹配器的内容,而不是它所期望的内容。 - 如果您使用
TypeSafeMatcher
,您将收到所选类型的对象,您有责任对其进行描述。它将为您检查非无效性和类类型,并在类不匹配时提供合理的错误消息。
不必担心在匹配器中进行错误的转换。 Mockito 在 verification 中将对其验证的调用包装在一个非常慷慨的 try/catch block 中。和 invocation matching因此 ClassCastException 无论如何都会返回 false(或无法匹配)。
那么,为什么会接口(interface) Matcher
接受超过其类型参数允许的范围?
This method matches against Object, instead of the generic type T. This is because the caller of the Matcher does not know at runtime what the type is (because of type erasure with Java generics). It is down to the implementations to check the correct type.
因此,换句话说,即使 Matcher 被参数化,它也不会在运行时提供非常强大的类型安全检查。但是,在 Mockito 中,它非常有用-- argThat(Matcher<T>)
返回 T
类型的值而不是 Object
, 所以你不必每次使用 argThat(...)
都强制转换在你的测试中。
关于java - 哪些对象将传递给 Mockito 中的自定义 ArgumentMatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065855/