使用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,......),但它们都只能创建新的模拟对象。他们似乎都没有能够取代方法的实现。
有办法吗?如果没有,我怎么能测试这样的代码而不依赖于测试运行的那一年?
答案 0 :(得分:1)
一种方法是让do_something_with_the_year
可以访问您的测试用例(例如,使其受到保护)。这也很好,因为它分离了查找依赖项并实际使用它们。
另一种方法是将逻辑置于特征中,使currentYear
方法受到保护,并让对象成为该特征的实例。这样你就可以在测试中创建一个自定义对象,而不需要任何模拟库。
答案 1 :(得分:1)
ScalaMock可以模拟它在这里说的单个对象:http://paulbutcher.com/2011/11/06/scalamock-step-by-step/
除了traits(接口)和函数之外,它还可以模拟:
课程
单身和伴侣对象(静态方法)......