【发布时间】: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 <T> T[] anyVarargOf(Class<T>)或类似的方法。但在这一点上,我只是不够了解,无法写出一个好的答案。