java - 哪些对象将传递给 Mockito 中的自定义 ArgumentMatcher

标签 java mockito

我正在 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/

相关文章:

java - 使用用户的区域设置时用秒格式化日期和时间

java - 存储在共享首选项中的值

java - 当您单击 HTML 中的 <button>/&lt;input&gt; 时,到底会发生什么?

java - 从 JSF-repeat 检索输入值

Java 使用 Mockito 测试 UI

java - 客户端线程和服务器,服务器显示客户端 1's message, then client 2' s 消息,然后 1 等

java - 为一个方法编写单元测试,该方法调用java中同一类的其他私有(private)方法。如何模拟私有(private)方法

java - 在 spock 中模拟 Jdbc 接口(interface)

java - Junit 模拟私有(private)方法

java - org.hamcrest.Matchers.any 在 java 8 中不工作