我想模拟一个在参数中进行回调的方法,让我们说:
methodToMock[T](callback: (String, String) => T)
使用播放2.3 ,(specs2版本2.3.8)我设法使用mockito的方法doAnswer
来完成:
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并且没有找到有关{{1}的修改的任何文档},以及我用例的用法示例。
你知道我做错了什么,以及解决这个问题的方法吗?
编辑:
我想展示一个简化的案例,但是删除了问题的根源......该方法的真正定义也采用了隐式参数列表:
doAnswer
这意味着 specs2 似乎返回一个数组而不是一个元素(尽管这两个版本之间的行为确实发生了变化)。
现在可以使用以下代码
methodToMock[T](callback: (String, String) => T)(implicit value: String)
答案 0 :(得分:1)
您使用的是哪个版本的规格2?使用3.6.5
(最新),以下工作正常
case class T() {
def methodToMock[A](callback: (String, String) => A) = 1
}
val m = mock[T]
doAnswer({ invocation =>
val method = invocation.asInstanceOf[(String, String) => Any] // L.34
method("role", "key")
}).when(m).methodToMock[Any](any)
m.methodToMock((s: Any, s2: Any) => s.toString.size + s2.toString.size) === 7