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)
'[Ljava.lang.Object作品;'意味着你正在訪問值,而不是第一個參數數組。 – Eric
你是對的!我專注於演員陣容,並沒有考慮到我在第一個演員之後有一個隱含的參數列表,我會更新我的問題。 – Antoine