我在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。
答案 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()
}
}
的构造函数。