[英]Unit test: mock nested scala val
我有兩個案例類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
}
類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))
}
還要注意 ,具有涉及邏輯的案例類需要進行單元測試,這是不尋常的。 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))
}
現在,毫無疑問該如何正確測試了,對嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.