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

scala-单元测试-如何在类中模拟类方法,scala,unit-testing,mockito,Scala,Unit Testing,Mockito,我在Scala中有一个类,如下所示: class A { private val b = new B() def doSomething() { b.someMethod(); } } val b = mock[B] when(b.someMethod()).thenReturn(xx) val class_to_test = new A() class_to_test.doSomething() 如何进行单元测试doSomething()?如何在此处模拟b 我试过这样

我在Scala中有一个类,如下所示:

class A {
  private val b = new B()

  def doSomething() {
    b.someMethod();
  }
}
val b = mock[B]
when(b.someMethod()).thenReturn(xx)
val class_to_test = new A()
class_to_test.doSomething()
如何进行单元测试
doSomething()
?如何在此处模拟
b

我试过这样的方法:

class A {
  private val b = new B()

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

我正在使用Mockito和MockitoSugar。

上一个代码片段的问题是
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()
这种技术称为依赖注入。您可以在此处阅读更多信息:


如果不想将
b
公开为公共构造函数参数,可以使用包私有构造函数与提供默认值
b
的公共构造函数或工厂方法结合使用:

class A private[myPackage](b: B) {
  def this() = this(new B)  // The public constructor doesn't expose b.

  def doSomething(): Unit = {
    b.someMethod()
  }
}

然后确保您的测试在同一个包中,这样他们仍然可以调用采用
b

的构造函数。为什么您的方法不起作用?我找不到将模拟b传递给classToTest的方法。谢谢您的回复。两种解决方案都有效!我不能否决这个解决方案,因为我是个新手