2015-09-25 57 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'显式调用时,我看到了同样的问题...... –

相关问题