2015-11-20 58 views
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) 
+1

'[Ljava.lang.Object作品;'意味着你正在访问值,而不是第一个参数数组。 – Eric

+0

你是对的!我专注于演员阵容,并没有考虑到我在第一个演员之后有一个隐含的参数列表,我会更新我的问题。 – Antoine

回答

1

您正在使用哪个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