Scala测试:替换功能实现

时间:2014-08-03 05:16:48

标签: scala mocking mockito scalatest scalamock

使用ScalaTest,我想在测试用例中替换函数实现。我的用例:

object Module {
  private def currentYear() = DateTime.now().year.get

  def doSomething(): Unit = {
    val year = currentYear()
    // do something with the year
  }
}

我想编写单元测试Module.doSomething,但我不希望这个测试用例依赖于测试运行的实际年份。

在动态语言中,我经常使用一个可以替换函数实现的构造来返回固定值。

我希望我的测试用例将Module.currentYear的实现更改为始终返回2014,无论实际年份是什么。

我找到了几个模拟库(Mockito,ScalaMock,......),但它们都只能创建新的模拟对象。他们似乎都没有能够取代方法的实现。

有办法吗?如果没有,我怎么能测试这样的代码而不依赖于测试运行的那一年?

2 个答案:

答案 0 :(得分:1)

一种方法是让do_something_with_the_year可以访问您的测试用例(例如,使其受到保护)。这也很好,因为它分离了查找依赖项并实际使用它们。

另一种方法是将逻辑置于特征中,使currentYear方法受到保护,并让对象成为该特征的实例。这样你就可以在测试中创建一个自定义对象,而不需要任何模拟库。

答案 1 :(得分:1)

ScalaMock可以模拟它在这里说的单个对象:http://paulbutcher.com/2011/11/06/scalamock-step-by-step/

  

除了traits(接口)和函数之外,它还可以模拟:

     

课程

     

单身和伴侣对象(静态方法)......