【发布时间】: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<?>。你实际上有一个原始类型,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