在 specs2 中使用重载方法有什么技巧吗?
are there any tricks to working with overloaded methods in specs2?
我一直在试图匹配重载方法时被打败。
我是 scala 和 specs2 的新手,所以这可能是一个因素 ;)
所以我有一个模拟这个SchedulerDriver class
我正在尝试验证正在讨论的参数的内容
传递给此 launchTasks 方法的签名:
我试过 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]
所以它不能直接重载分辨率)。
我一直在试图匹配重载方法时被打败。
我是 scala 和 specs2 的新手,所以这可能是一个因素 ;)
所以我有一个模拟这个SchedulerDriver class
我正在尝试验证正在讨论的参数的内容 传递给此 launchTasks 方法的签名:
我试过 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]
所以它不能直接重载分辨率)。