单元测试:模拟嵌套 scala val
Unit test: mock nested scala val
我有两个案例 class A 和 AHelper
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 A 将 AHelper 的实例作为其成员之一。
我只想为 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))
}
现在,没有关于如何正确测试的问题了,对吧?
我有两个案例 class A 和 AHelper
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 A 将 AHelper 的实例作为其成员之一。
我只想为 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))
}
现在,没有关于如何正确测试的问题了,对吧?