2

我正在使用 scalatest 对扩展特征的类进行单元测试(从某种意义上说,我的类将特征用作 mixin)。

该特征包含的方法是辅助方法(最终调用数据库中的一些查找),我想将其存根,以便我可以仅隔离我的类的功能。但是我还没有找到像 Mockito 或 ScalaMock 这样的框架来实现这一点。

问题:可以使用模拟框架来实现吗?如果可以,如何实现?如果没有,我很想知道是否有原因。

例如。

trait MyTrait {
  def usefulMethod(i: int) = {...}
}


class MyClass extends MyTrait {
  def numberCruncher = {
     val x = usefulMethod(1) + 1
  }
}

我需要根据 i 的值返回不同的存根答案。类似于 Mockito 的东西 when(myTrait.usefulMethod(1)).thenReturn(10)

我还需要验证是否在具有正确值的特征中调用了不同的方法。

本质上,我是在再次问这个问题,但我注意到这是在 2011 年提出的,事情可能已经发生了变化。可能会有新的框架和新的方法。这个 2001 年的问题也没有询问如何验证特征中的方法。

问题:以这种方式使用 traits-as-a-mixin 是否实际上阻止了使用模拟框架对来自 mixin 的模拟/存根方法进行单元测试的能力?即模拟和存根框架是否依赖于依赖注入的使用?

PS。直到现在我一直在使用 Mockito,但我并不反对使用 scalamock 或任何其他框架。我研究了 scalamock,因为它宣传它可以测试特征,但是从 scalamock 自己的测试看来,虽然它可以模拟特征,但如果该特征作为依赖项传递给类而不是类,则只能存根模拟行为扩展该特征。看这里

4

1 回答 1

2

我通常对被测类进行子类化以替换我想要模拟的方法:

var usefulInput: Option[Int] = Nont
val testInstance = new MyClass {
  override def usefulMethod(i: Int) = {
    usefulInput = Some(i)
    42
  }
}

testInstance.numberCruncher should equal(43)
usefulInput should equal(Some(1))

我发现内联覆盖通常比任何模拟框架更容易实现和阅读

于 2015-11-14T22:14:42.803 回答