2

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

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

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

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

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

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

我发现了几个模拟库(Mockito、ScalaMock、...),但它们都只能创建新的模拟对象。它们似乎都无法替代方法的实现。

有没有办法做到这一点?如果不是,我如何在不依赖于测试运行年份的情况下测试这样的代码?

4

2 回答 2

1

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

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

于 2014-08-03T08:29:23.333 回答
1

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

除了特征(接口)和函数,它还可以模拟:

课程

单例和伴随对象(静态方法)...

于 2014-08-03T09:32:13.773 回答