在scala play 2.4中使用函数作为参数调用doAnswer

时间:2015-11-20 15:34:28

标签: scala mockito specs2 playframework-2.4

我想模拟一个在参数中进行回调的方法,让我们说:

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)

1 个答案:

答案 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