单元测试:模拟嵌套 scala val

Unit test: mock nested scala val

我有两个案例 class AAHelper

case class AHelper(data: String) {
  def getData() = {...} // Complex operation inside
}

case class A(data1: String, data2: String) {
  private val aHelper = AHelper(data2)    // AHelper instance
  def getData() = {data1 + aHelper.getData; ...} // Complex operation inside
}

class AAHelper 的实例作为其成员之一。

我只想为 A 编写单元测试,模拟 AHelper

Scala 版本:2.11

助手应该是一个参数:

case class A(data1: String, data2: String)(aHelper: AHelper = AHelper(data2))

现在在你的测试中,你可以做:A("foo", "bar")(mock[AHelper])

如果你不喜欢第二个参数列表,有几个选项:

使其隐含:

case class A(data1: String, data2: String)(implicit aHelper: AHelper = AHelper(data2))

这样您就可以创建仅包含 new A("foo", "bar") 的实例,而无需将 () 塞到末尾

或者,创建一个伴随对象:

 object A {
   def apply(data1: String, data2: String): A = A(data1, data2)(AHelper(data2))
 }

注意 另外,这种情况 class 涉及需要单元测试的逻辑是......不寻常的。 Case class 只是一个数据的哑持有者,如果你愿意的话,一个带有命名字段的元组。您应该考虑将您的逻辑从这些 class 中拆分出来,或者将它们设为 "regular"(不区分大小写)class。

例如:

case class A1(data: String)
case class A2(data1: String, data2: A1)

trait AHelper {
  def getData(a1: A1)
}

class  AReader(helper: AHelper) {
  def getData(a: A2) = a.data1 + helper.getData(a.data2))
}

现在,没有关于如何正确测试的问题了,对吧?