1
我想嘲笑采取在参数的回调让我们说一个方法:与函数调用doAnswer作为参数阶打2.4
methodToMock[T](callback: (String, String) => T)
随着打2.3,(specs2版本2.3.8)我设法该方法doAnswer
做它的Mockito:
doAnswer({ invocation =>
val method = invocation.asInstanceOf[(String, String) => Any] // L.34
method(role, key)
}).when(myMock).methodToMock[Any](any)
但由于打2.4(使用特殊依存specs2,版本2.4.2 ),前面的代码将无法正常工作,告诉我:
[Ljava.lang.Object; cannot be cast to scala.Function2 (MySpec.scala:34)
我真的不明白,为什么开始的Mockito使用我的代码Java对象,因为我使用的specs2 implementation,并没有发现任何文件关于doAnswer
的修改,以及我的用例的使用示例。
你知道我做错了什么和解决办法吗?
编辑:
我想展示一个简化的情况,但删除了问题的根源...该方法的实际定义也需要一个隐含的参数列表:
methodToMock[T](callback: (String, String) => T)(implicit value: String)
这意味着specs2似乎返回一个数组而不是单个元素(尽管它的行为真的在两个版本之间改变)。
下面的代码现在工作
doAnswer({ invocation =>
val firstArgList = invocation.asInstanceOf[Array[Object]](0)
val method = firstArgList.asInstanceOf[(String, String) => Any] // L.34
method(role, key)
}).when(myMock).methodToMock[Any](any)(any)
'[Ljava.lang.Object作品;'意味着你正在访问值,而不是第一个参数数组。 – Eric
你是对的!我专注于演员阵容,并没有考虑到我在第一个演员之后有一个隐含的参数列表,我会更新我的问题。 – Antoine