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



我一直在尝试匹配一个重载方法。

我是scala和specs2的新手,所以这可能是一个因素;)

所以我有一个模拟这个SchedulerDriver类

,我正试图验证参数的内容传递给这个launchTasks方法的签名:

http://mesos.apache.org/api/latest/java/org/apache/mesos/SchedulerDriver.html launchTasks (java.util.Collection % 20 java.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]])

任何关于如何处理这个问题的指导或建议都很感激…!

最好的,托尼。

在这种情况下可以使用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],因此它不能指导重载分辨率)。

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

相关内容

  • 没有找到相关文章

最新更新