mockito:如何在java 8中匹配可变参数?

2024-05-06

我正在努力将项目从 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 中。我正在使用mockito 1.9.5。

正确的使用方法是怎样的anyVarArg()java 8 中的参数匹配?


问题在于类型推断得到了改进。anyVararg()是一个通用方法,但您在嵌套方法调用中使用它。在 Java 8 之前,类型推断的限制强制处理方法<T> T anyVararg() like <Object> Object anyVararg()当作为参数放置到另一个方法调用而不插入显式类型参数时。

So only query(String, ResultSetHandler, Object...)匹配,因为第三个参数被视为类型Object.

但现在,Java 8 类型推断可以使用嵌套方法调用。因此<T> T anyVararg()类型参数<T>可以只是anything, 有可能ResultSetHandler以及。所以query(String,Object,ResultSetHandler)现在也是比赛候选人。

(I omitted the type parameter <T> from the outer call in both cases to make it less confusing)

由于我们现在有两个可能的匹配,因此这里应用方法选择的正常程序。是的,这是模棱两可的。第一个参数是相同的,String,但对于另外两个ResultSetHandler比更具体Object但是,虽然一个候选者接受第二个参数的更具体类型,但另一个候选者接受第三个(及后续参数)。

很明显,允许方法的返回类型为任意类型的类型参数是歧义的根源,但像 Mockito 这样包含此类方法的 API 是 Java 编程的一个特殊情况。您必须以通用方式强制类型Matchers.<Desired>anyVararg()或通过类型转换(Desired)anyVararg().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mockito:如何在java 8中匹配可变参数? 的相关文章

随机推荐