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



我想模拟一个在参数中回调的方法,比如说:

methodToMock[T](callback: (String, String) => T)

使用play 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实现,没有找到任何关于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)

您使用的是哪种版本的specs2?使用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

相关内容

  • 没有找到相关文章

最新更新