【问题标题】:The method in the Type is not applicable for the arguments for varargs method upgrading to Java 1.8Type 中的方法不适用于 varargs 方法升级到 Java 1.8 的参数
【发布时间】:2017-03-02 12:35:22
【问题描述】:

我在我的项目中使用 Mocikto 框架(版本 1.9.5)使用 Java 1.7 进行单元测试现在我正在迁移我的项目以使用 Java 1.8 构建和运行.

在我的一个单元测试中,我试图模拟以下方法

public <T> List<T> myMethod(final String sql, final MyMapper<T> MyMapper, final Argument... args) 

使用此代码

String learningId = "testLeaId";
String catalogId = "testCatId";
List<String> returnList = new ArrayList<String>();
returnList.add(catalogId);
when(myService.myMethod(Mockito.anyString(), Mockito.any(MyMapper.class), (Argument[]) Mockito.anyVararg())).thenReturn(returnList);

现在,当我在 pom.xml 中将 Java 版本升级到 1.8 时,此代码在 Java 1.7 上运行良好,出现以下错误...

[ERROR] The method myMethod(String, MyMapper<T>, Argument...) in the type MyService is not applicable for the arguments (String, MyMapper, Argument)
        C:\somepath\MyDaoTest.java:59

谁能帮我解决这个错误?谢谢

【问题讨论】:

  • 这是一个编译错误,这个 myService 中可能有一些模糊的方法声明会导致这种情况,虽然你的方法签名和它的模拟看起来不错,你能发布更多关于这个MyService班级?您的 IDE 上没有收到任何错误/警告吗?
  • 我在 java 1.7 和 1.8 中都没有遇到与你的代码完全相同的错误,也许你的测试指的是过时的方法、类等。你使用的是 maven 吗?尝试做一个mvn clean install,这可能是罪魁祸首,除此之外什么都没有想到:/
  • 提示:仍在等待关于答案的任何类反馈。我以为只有我们这些新手在这里提出问题并且从不费心回头看;-(

标签: java java-8 mockito


【解决方案1】:

在 Java 8 中,类型推断得到了改进,因此您应该可以更改

Mockito.any(MyMapper.class)

Mockity.any()

例如。 (假设您使用的是最新版本的 Mockito 本身)

然后你可以发现...anyVarArg()deprecated,并且也可以使用 any()

【讨论】:

  • 类型推断已针对参数化类型进行了改进。在这种情况下,Mockito.any(MyMapper.class) 的类型是MyMapper,而不是MyMapper&lt;?&gt;,所以它是一个原始类型。根据设计,类型推断对原始类型没有帮助。
  • 我不确定我是否可以跟随。错误消息确切地抱怨了这一点: any(MyMapper.class) 导致类型 MyMapper.class ...但是来自 Mockito 2.10+ 的新改进的 any() 将返回正确的 expected 类型 @987654329 @?!
  • 不赞成,因为我不确定你是对的。我知道类型推断已经改进了很多,但我必须自己努力找出什么时候需要类型提示,什么时候不需要。我不确定哪种方式,所以我不投票
  • 也许我必须花一些时间自己创建一个完整的小例子。谢谢你的想法。在没有给出任何理由的情况下投反对票似乎很粗鲁......
  • 我同意使用 Mockity.any() 可能/应该使用 Java 8 的类型推断,但它没有回答为什么 OP 的原始代码会失败。事实上,我看不出有什么原因,所以在不知道导致 OP 问题的原因的情况下,无法判断这是否是一个解决方案。 Mockity.any() 应该可以工作,但是 OP 的代码应该也可以工作......
【解决方案2】:

我认为 Java 8 更节省类型,因为您想要一个 MyMapper&lt;T&gt;,但您只使用 MyMapper 访问它。

解决办法是使用

Mockito.<MyMapper<ConcreteType>>any()

【讨论】:

  • 看我的回答:我认为即使是那些类型提示也不再需要了!
  • 我也没有投反对票 ;).. 目前两个版本都可以使用。但我的会更具体,因为它要求通用的具体类型,如果你想测试它会有所帮助。
猜你喜欢
  • 2018-07-19
  • 2015-12-20
  • 1970-01-01
  • 2019-04-04
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多