簡體   English   中英

單元測試:模擬嵌套scala val

[英]Unit test: mock nested scala val

我有兩個案例類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
}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM