【问题标题】:Mockito: Ambiguous reference to overloaded definitionMockito:对重载定义的模糊引用
【发布时间】:2017-05-11 06:51:35
【问题描述】:

鉴于以下使用 Mockito 模拟 Scala 类的代码,我收到错误并且无法编译:

import org.mockito.Mockito._

class Testeable {
  def fun1 = 1
  def fun2 = 2
}

object test {

  def getMock = {
      val testMock = mock[Testeable]  // <-- this line throws the error
      when(testMock.fun1).thenReturn(3)
      testMock
  }

}

错误是:

对重载定义的模糊引用,两个方法都在模拟 类型的对象 Mockito (x$1: Class[common.Testeable], x$2: org.mockito.MockSettings)common.Testeable 和对象中的方法模拟 Mockito 类型 (x$1: Class[common.Testeable], x$2: org.mockito.stubbing.Answer[_])common.Testeable 匹配预期类型?

我只是嘲笑了一个类,有什么歧义?

【问题讨论】:

  • mock(classOf[Testeable])?它需要一个java.lang.Class,而classOf 方法提供它,就像在Java 中你可以做Testeable.class
  • 更正,Any 类有一个getClass 方法,因此对于非泛型类,如IntString 等,您可以使用getClass 和泛型类,如List[T]你使用classOf[List[_]] 来自Predef...
  • 谢谢,它使用mock(classOf[Testeable])工作
  • @insan-e 模拟Int 听起来是个好主意! :)

标签: scala mockito


【解决方案1】:

你不能像这样直接使用mockito(你可以使用它,但不能让它看起来这么漂亮)。看看scala test library。 解决当前问题的最简单方法是将MockitoSugar 混入您的测试类,而不是导入Mockito._,然后mock[Foo] 将按照您的预期工作。 库提供了许多其他东西来在 scala 中编写惯用的测试代码,因此您应该阅读我链接到的那个站点上的一些文档和示例。

【讨论】:

  • 使用mock(classOf[Testeable]) 似乎有效。想法?
  • Mockito 中有不同的重载风格的mock。您之前的参数化参数需要两个参数。采用单个 Class 参数的那个适用于后一种语法。不知道是什么让你对此感到厌烦。
  • 问题是 scala 不能很好地处理带有省略号的签名,它无法区分两者。这是 spy / doReturn 返回 AnyVal 场景的更大问题
  • @AndrewNorman 不,这与省略号无关。此外,scala 处理得很好。
  • @Dima scala 省略号问题在以下 sn-p 中很容易识别: val myBool = false class MyClass(){ def booleanTest(): Boolean = {false} } val mySpy = spy(new MyClass) doReturn(myBool).when(mySpy).booleanTest 编译错误:对重载定义的模糊引用,类型为 (x$1: Any, x$2: Object*)org.mockito.stubbing.Stubber 的对象 Mockito 中的两个方法 doReturn 和类型为 (x$1: Any)org.mockito.stubbing.Stubber 的对象 Mockito 中的方法 doReturn 匹配参数类型(布尔)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2020-04-16
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多