2011-08-13 31 views
1

作爲一個例子,我有一個簡單的提取器,Planex,拆分.plan文件字符串並將它們放回到一起。我有幾個單元測試,它很好地定義了它的行爲。這裏的提取:如何在scala中模擬或存根大小寫類和提取器?

object Planex { 
    def apply(metadata: String, plan: String) = { 
    String.format("%1$sPlan:\n%2$s", metadata, plan) 
    } 
    def unapply(str: String) = { 
    val ixPlanLabel = str indexOf "Plan:" 
    when(ixPlanLabel>=0) { 
     (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim) 
    } 
    } 
} 

我有一個Actor使用此。

class PlanRepo(env: { 
    val jsonFormats: Formats 
    val load:() => String 
    val planTarget: String => Unit 
}) extends Actor { 
    implicit val jsonFormats = env.jsonFormats 
    def receive = { 
    case (metaData: String, plan: Plan) => { 
     val s = Planex(metaData,write(plan)) 
     env.planTarget(s) 
    } 
    case r: PlanRequest => { 
     val Planex(metaData, planStr) = env.load() 
     self.channel ! (metaData, read[Plan](planStr)) 
    } 
    } 
} 

從我上PlanRepo測試中,我能夠在所有依賴的傳遞,除了Planex。爲此,我仍然使用具體的提取器對象。所以我的回購測試實際上也在測試Planex的單獨測試的行爲。有沒有解決的辦法?

我有一組嵌套的case類定義本文檔的json部分的層次結構的類似問題 - 我無法將它們彼此分開。

回答

2

定義特徵提取器,然後只有Planex擴展該特徵,而不是直接實現它們。或者,如果您願意,可以在trait中定義接口,然後在擴展該特徵的對象中實現它。

trait PlanexAPI { 
    def apply(metadata: String, plan: String): String 
    def unapply(str: String): Option[String] 
    } 
} 

object Planex extends PlanexAPI { 
    def apply(metadata: String, plan: String) = { 
    String.format("%1$sPlan:\n%2$s", metadata, plan) 
    } 
    def unapply(str: String) = { 
    val ixPlanLabel = str indexOf "Plan:" 
    when(ixPlanLabel>=0) { 
     (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim) 
    } 
    } 
} 
+0

當然。不知道爲什麼我沒有想到這一點。我對混淆嵌套案例類的困惑依然存在,但我會分開討論這個問題。 – traffichazard

相關問題