【问题标题】:Calling an overloaded java generic method from scala从 scala 调用重载的 java 泛型方法
【发布时间】:2011-11-13 21:29:22
【问题描述】:

我使用 Mockito 来模拟一个对象,该方法返回一个未参数化的 ArrayList,但我不知道如何让它工作

要模拟的方法签名

public java.util.ArrayList getX()

测试代码

var mockee = mock(classOf[Mockee])
when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_])

这实际上在 IntelliJ 中编译得很好,但在运行时会抛出:

[error] ....scala:89: overloaded method value thenReturn with alternatives:
[error]   (java.util.ArrayList[?0],<repeated...>[java.util.ArrayList[?0]])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]] <and>
[error]   (java.util.ArrayList[?0])org.mockito.stubbing.OngoingStubbing[java.util.ArrayList[?0]]
[error]  cannot be applied to (java.util.ArrayList[_$1])
[error]       when(mockee.getX).thenReturn(Lists.newArrayList(x): ArrayList[_])

【问题讨论】:

  • 我可能是错的,但我认为 Scala 中的 ArrayList[_] 与未参数化的 ArrayList 不同,它是一种存在类型——即它有一个类型参数,但它绑定在一个有趣的地方地方。我认为未参数化的类型将是ArrayList[AnyRef] 即由java.lang.Object 参数化。
  • 这看起来像是编译时错误,而不是运行时错误。 Scala 的存在类型ArrayList[_] 最接近Java 的通配符类型ArrayList&lt;?&gt;。你实际上有一个原始类型,ArrayList。要研究的两个 SO 问题:Scala's existential types 和 Raw types and wildcard...
  • 你说得对,这是一个编译时错误,但 scala 插件没有突出显示。我可以通过使用 thenAnswer(new Answer[ArrayList[_]]{ def answer(arg: InvocationOnMock) = Lists.newArrayList(x)}) 来解决这个问题,但这不是很好

标签: java generics scala mockito


【解决方案1】:

以下对我有用:

val mockee = mock(classOf[Mockee])
when[ArrayList[_]](mockee.getX).thenReturn(Lists.newArrayList)

假设“Lists”类来自 Google 集合(现在是 Guava)。

【讨论】:

  • 完美——我从没想过要添加方法参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多