【问题标题】:mockito: How to match varargs in java 8?mockito:如何在 java 8 中匹配可变参数?
【发布时间】:2014-03-24 21:10:30
【问题描述】:

我正在将一个项目从 java 7 迁移到 8,并且在 Mockito“何时”的情况下遇到了编译错误,我很难追踪:

when(queryRunner.query(any(String.class), any(ResultSetHandler.class), anyVararg())).thenReturn(mockedWordResultList);

给我一​​个编译错误:

java: reference to query is ambiguous   both method
<T>query(java.lang.String,java.lang.Object,org.apache.commons.dbutils.ResultSetHandler<T>)
in org.apache.commons.dbutils.QueryRunner and method
<T>query(java.lang.String,org.apache.commons.dbutils.ResultSetHandler<T>,java.lang.Object...)
in org.apache.commons.dbutils.QueryRunner match

此错误发生在版本 1.8.0-b128 中,但不会发生在 1.7.0_45 中。我正在使用模拟 1.9.5。

在 java 8 中使用anyVarArg() 参数匹配的正确方法是什么?

【问题讨论】:

  • 我手边没有Java 8,所以不能轻易测试;但是如果将第三个参数转换为 Object[] 会发生什么?
  • 我尝试使用 any(Object[].class) 但它不匹配。
  • 我的问题是如果你投射它会怎样。换句话说,将(Object[])anyVararg() 作为第三个参数传递。
  • 不错的收获!!!那解决了它。如果您想将其添加为答案,我会投票并接受。
  • 是的,在我给出答案之前,我想进一步研究一下为什么会发生这种情况。显然,Java 8 已经改变了它解析类型参数的方式,而 Mockito 可能需要改变才能匹配。最有可能的是,我们最终会向Matchers 添加一个类似public &lt;T&gt; T[] anyVarargOf(Class&lt;T&gt;) 或类似的方法。但在这一点上,我只是不够了解,无法写出一个好的答案。

标签: java mockito java-8


【解决方案1】:

问题是类型推断得到了改进。 anyVararg() 是一个通用方法,但您在嵌套方法调用中使用它。在 Java 8 之前,类型推断的限制迫使将方法 &lt;T&gt; T anyVararg() 当作 &lt;Object&gt; Object anyVararg() 放在作为另一个方法调用的参数而不插入显式类型参数时。

所以只有 query(String, ResultSetHandler, Object...) 匹配为第三个参数被视为 Object 类型。

但现在 Java 8 类型推断可以与嵌套方法调用一起使用。因为对于&lt;T&gt; T anyVararg(),类型参数&lt;T&gt; 可以只是anything,它也可以是ResultSetHandler。所以query(String,Object,ResultSetHandler) 现在也是一个匹配候选者。

(在这两种情况下,我都从外部调用中省略了类型参数&lt;T&gt;,以减少混淆)

由于我们现在有两个可能的匹配项,因此这里适用方法选择的正常过程。是的,这是模棱两可的。第一个参数是相同的,String,但对于其他两个 ResultSetHandlerObject 更具体,但是当一个候选人接受第二个参数的更具体的类型时,另一个接受第三个参数(并遵循 - UPS)。

很明显,允许方法的返回类型为任意值的类型参数会造成歧义,但像 Mockito 这样包含此类方法的 API 是 Java 编程的一个极端案例。您将不得不以通用方式 Matchers.&lt;Desired&gt;anyVararg() 或通过类型转换 (Desired)anyVararg() 强制类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多