在 scala play 2.4 中以函数作为参数调用 doAnswer
Call doAnswer with function as argument in scala play 2.4
我想模拟一个在参数中接受回调的方法让我们说:
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)
但是自从play 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 似乎 return 一个数组而不是单个元素(虽然它的行为在两个版本之间确实发生了变化)。
以下代码现在有效
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
我想模拟一个在参数中接受回调的方法让我们说:
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)
但是自从play 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 似乎 return 一个数组而不是单个元素(虽然它的行为在两个版本之间确实发生了变化)。
以下代码现在有效
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