【问题标题】:Scala Testing: Replace function implementationScala 测试:替换函数实现
【发布时间】:2014-09-25 22:25:30
【问题描述】:

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

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

【问题讨论】:

    标签: scala mocking mockito scalatest scalamock


    【解决方案1】:

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

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

    【讨论】:

    • 两种有效的解决方案,但我不喜欢这种设计。 Module 的用户不需要知道 Module 用了一年的时间。动态语言允许以这种方式存根函数。 scala中没有办法这样做吗?
    • 这将是公共接口,是对象的一部分,它是在 trait 中实现的,将是包私有实现细节,因此用户不必知道。如果您真的想模仿动态语言,请查看有关 scalamock 的 samthebests 答案。
    【解决方案2】:

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

    除了traits(接口)和函数,它还可以mock:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多