scala - 单元测试 - 如何在类中模拟类方法

时间:2018-05-11 20:45:25

标签: scala unit-testing mockito

我在Scala中有一个类如下:

class A {
  private val b = new B()

  def doSomething() {
    b.someMethod();
  }
}

我如何进行单元测试doSomething()?我怎么能在这里模仿b

我试过这样的事情:

val b = mock[B]
when(b.someMethod()).thenReturn(xx)
val class_to_test = new A()
class_to_test.doSomething()

我正在使用Mockito和MockitoSugar。

1 个答案:

答案 0 :(得分:2)

您上一个代码段的问题是,val b = mock[B]是与您班级的b字段不同的变量。您可以通过修改类来将b作为可选参数来解决此问题:

class A(b: B = new B) {
  def doSomething(): Unit = {
    b.someMethod()
  }
}

现在您的测试成为:

val b = mock[B]
when(b.someMethod()).thenReturn(xx)
val classToTest = new A(b)
classToTest.doSomething()

此技术称为依赖注入。您可以在此处详细了解:What is dependency injection?

如果您不希望将b公开为公共构造函数参数,则可以使用package-private构造函数以及提供默认值{{1}的公共构造函数或工厂方法。 }:

b

然后确保您的测试位于同一个包中,这样他们仍然可以调用带class A private[myPackage](b: B) { def this() = this(new B) // The public constructor doesn't expose b. def doSomething(): Unit = { b.someMethod() } } 的构造函数。

相关问题