Scala 测试 : Replace function implementation

标签 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,...),但它们都只能创建新的模拟对象。它们似乎都无法取代方法的实现。

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

最佳答案

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

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

关于Scala 测试 : Replace function implementation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25101867/

相关文章:

generics - Scala 隐式 ClassManifest[T] 在 Array.fill(..) 中为 null

scala - 案例类和隐式参数以及模式匹配

java - 单元测试私有(private)内部类方法

scala - 使用 Apache Zeppelin 重新运行带有 -deprecation 的 Scala 代码

json - 从spark scala中的多行文件中读取JSON文件

python - 单元测试模拟 urllib.request.urlretrieve() Python 3 和内部函数

python - 在 Python 中模拟 ImportError

c# - 支持模拟以委托(delegate)为参数的方法的模拟框架

java - 带有局部变量的 Mockito

java - 在抽象类中模拟静态方法