2015-09-25 60 views
0

我一直在試圖在重載的方法上進行匹配。是否有任何技巧來處理specs2中的重載方法?

我是新來的Scala和specs2,所以這是有可能的一個因素;)

,所以我有這個SchedulerDriver class

一個模擬的,我嘗試驗證的參數的內容正在 傳遞給這個launchTasks方法的簽名:

http://mesos.apache.org/api/latest/java/org/apache/mesos/SchedulerDriver.html#launchTasks(java.util.Collection,%20java.util.Collection)

我試圖像這樣的answers風格:

val mockSchedulerDriver = mock[SchedulerDriver] 
mockSchedulerDriver.launchTasks(haveInterface[Collection[OfferID]], haveInterface[Collection[TaskInfo]]) answers { i => System.out.println(s"i=$i") } 

,並得到

ambiguous reference to overloaded definition, both method launchTasks in trait SchedulerDriver of type (x$1: org.apache.mesos.Protos.OfferID, x$2: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status and method launchTasks in trait SchedulerDriver of type (x$1: java.util.Collection[org.apache.mesos.Protos.OfferID], x$2: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status match argument types (org.specs2.matcher.Matcher[Any],org.specs2.matcher.Matcher[Any])

,我已經試過capture風格像這樣:

val mockSchedulerDriver = mock[SchedulerDriver] 
val offerIdCollectionCaptor = capture[Collection[OfferID]] 
val taskInfoCollectionCaptor = capture[Collection[TaskInfo]] 
there was one(mockSchedulerDriver).launchTasks(offerIdCollectionCaptor, taskInfoCollectionCaptor) 

,並得到:

overloaded method value launchTasks with alternatives: (x$1: org.apache.mesos.Protos.OfferID,x$2: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status <and> (x$1: java.util.Collection[org.apache.mesos.Protos.OfferID],x$2: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status cannot be applied to (org.specs2.mock.mockito.ArgumentCapture[java.util.Collection[mesosphere.mesos.protos.OfferID]], org.specs2.mock.mockito.ArgumentCapture[java.util.Collection[org.apache.mesos.Protos.TaskInfo]])

任何關於如何處理這個讚賞的指導或建議......!

best, tony。

回答

1

可以使用any匹配在這種情況下:

val mockSchedulerDriver = mock[SchedulerDriver] 

mockSchedulerDriver.launchTasks(
any[Collection[OfferID]],  
any[Collection[TaskInfo]]) answers { i => System.out.println(s"i=$i") 

不同的是,any[T]Matcher[T]和超載分辨率在這種情況下工作(而haveInterfaceMatcher[AnyRef]因此它可以」指導重載分辨率)。

0

我不明白爲什麼第一個替代方法不起作用,但第二個替代方法不起作用,因爲scala在解決調用哪個重載方法時沒有考慮隱式函數,並且可以讓您使用capture好像它是你捕獲的東西取決於隱式函數調用。

那麼,如果你明確表示它呢?

val mockSchedulerDriver = mock[SchedulerDriver] 
val offerIdCollectionCaptor = capture[Collection[OfferID]] 
val taskInfoCollectionCaptor = capture[Collection[TaskInfo]] 
there was one(mockSchedulerDriver).launchTasks(
    offerIdCollectionCaptor.capture, taskInfoCollectionCaptor.capture) 
+0

嗨@丹尼爾,謝謝你的迴應。不幸的是,當用'.capture'顯式調用時,我看到了同樣的問題...... –

相關問題