scala-模拟功能并替换测试中的实现

时间:2019-05-22 12:02:35

标签: scala unit-testing mocking

我正在使用scalatest,并且在测试代码时,我想替换函数的实现以在运行测试时返回其他内容。

在JavaScript中,它非常简单,我认为我可以在scala中做同样的事情。 所以我想要的是这样的:

object Module {
  private def bar(): Int = {
     5
  }

  def foo(): Unit = {
    println(bar())
  }
}

测试将是这样的(不要介意语法,您就会明白)

class Test extends FunSpec {
   mock(Module.bar, () => 1)
   describe("Test") {
      it("Test") {
         Module.foo() // will print 1
      }
   }
}

我已经搜索了Internet,并遇到了scala模拟库,但是似乎没有一个库能够代替方法的实现。 在每个库中,您都必须在测试中定义模拟并将其传递给代码,但我不想这样做。

反正有实现这一目标的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

您无法在Scala中模拟Object,因为它就像Java中的静态类(您也不能模拟)。 (而且您无法模拟不在mockitoscalamock中(可能在其下一版本中)的scala对象。)

但是,如果将object Module更改为class Module,则可以轻松地模拟此功能(使用模仿):

val mockModule = mock[Module]
when(mockModule.bar()).thenReturn(1)

答案 1 :(得分:1)

如果您不想使用模拟,则可以创建一个具有该功能的假类并放入所需的值,如下所示:

trait SMT{
 def bar: Int
}

class RealImpl extends SMT{
def bar: Int = 5
}

class FakeImpl extends SMT{
def bar: Int = 1
}