2015-11-20 33 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 
相關問題