单元测试:模拟嵌套scala val

时间:2019-04-05 07:23:19

标签: scala unit-testing scalatest

我有两个案例类 A AHelper

awk 'BEGIN{OFS="\t"} {sub(/\r$/,"");print $1 $2,"1"}'  Input_file

class A 具有 AHelper 的实例作为其成员之一。

我只想编写 A 的单元测试,嘲笑 AHelper

Scala版本:2.11

1 个答案:

答案 0 :(得分:3)

助手应该是一个参数:

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))
 }

注意另外,具有涉及逻辑且需要进行单元测试的案例类是……不寻常的。 Case类只不过是数据的愚蠢持有者,如果愿意的话,它是具有命名字段的元组。您应该考虑将逻辑从这些类中分离出来,或者改为使它们成为“常规”(非大小写)类。

例如:

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))
}

现在,毫无疑问该如何正确测试了,对吧?