【问题标题】:are there any tricks to working with overloaded methods in specs2?在 specs2 中使用重载方法有什么技巧吗?
【发布时间】:2015-09-25 14:14:01
【问题描述】:

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

我是 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]])

任何有关如何解决此问题的指导或建议表示赞赏...!

最好, 托尼。

【问题讨论】:

    标签: scala mockito specs2


    【解决方案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],因此它不能指导重载解析)。

    【讨论】:

      【解决方案2】:

      我不明白为什么第一个替代方案不起作用,但第二个替代方案不起作用,因为 scala 在解析要调用的重载方法时不考虑隐式函数,以及让您使用 @ 的魔法987654321@ 就好像它是您捕获的东西取决于隐式函数调用。

      如果你明确表示呢?

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

      【讨论】:

      • 嗨@daniel,感谢您的回复。不幸的是,我在使用.capture 显式调用时看到了同样的问题...
      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多