扩展特征的单元测试类 - 如何在特征中模拟和存根方法?

时间:2015-11-14 18:41:37

标签: scala unit-testing mockito scalatest scalamock

我使用scalatest对一个扩展特征的类进行单元测试(从某种意义上说,我的班级正在使用特征作为混合)。

该特征包含辅助方法(最终在数据库中调用一些查找)的方法,我想将其存根,以便我可以只隔离我的类的功能。但我还没有找到像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)

我还需要验证在特征中使用正确的值调用不同的方法。

本质上我再次问this question,但我注意到2011年有人提出这个问题,事情可能已经开始了。可能有新的框架和新方法。这个2001年的问题也没有询问如何验证特征中的方法。

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

PS。我一直在使用Mockito,但我并不反对使用scalamock或任何其他框架。我已经查看了scalamock,因为它宣称它可以测试特征,但是从scalamock自己的测试中可以看出,虽然它可以模拟特征,但是如果该特征作为依赖关系传递给a class,而不是扩展该特性的类。见here

1 个答案:

答案 0 :(得分:1)

我通常将测试中的类子类化为替换我想要模拟的方法:

Int

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