在 specs2 中使用重载方法有什么技巧吗?

are there any tricks to working with overloaded methods in 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: org.apache.mesos.Protos.OfferID, x: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status and method launchTasks in trait SchedulerDriver of type (x: java.util.Collection[org.apache.mesos.Protos.OfferID], x: 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: org.apache.mesos.Protos.OfferID,x: java.util.Collection[org.apache.mesos.Protos.TaskInfo])org.apache.mesos.Protos.Status <and> (x: java.util.Collection[org.apache.mesos.Protos.OfferID],x: 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]])

任何有关如何处理此问题的指导或建议,不胜感激...!

最好的, 托尼.

我不明白为什么第一个选择不起作用,但第二个选择不起作用,因为 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)

在这种情况下,您可以使用 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] 并且在这种情况下重载解析有效(而 haveInterface 是一个 Matcher[AnyRef] 所以它不能直接重载分辨率)。