2011-08-13 10 views
1

例として、単純な抽出器Planexを用意しています。この抽出器は.planファイルの文字列を取り出し、一緒に戻します。私は、その動作をかなり徹底的に定義した単体テストをいくつか持っています。私はこれを使用していますActorを持ってケースクラスとエクストラクタをスカラーでモックまたはスタブするにはどうしたらいいですか?

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

:ここでは、抽出です。 PlanRepo上の私のテストから

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

、私はPlanexを除いて、その依存関係のすべてに合格することができますよ。そのために、私はまだ具体的な抽出オブジェクトを使用しています。したがって、私のレポ・テストは実際には個別にテストされた動作をPlanexとしてテストしています。これを回避する方法はありますか?

私はこのドキュメントのjson部分の階層を定義するネストされたケースクラスのセットで同様の問題を抱えています - 私はお互いを分けることができません。

答えて

2

形質のエクストラクタを定義し、Planexにそれらを直接実装する代わりに拡張するだけです。

また、必要に応じて、特性にインターフェースを定義し、その特性を拡張するオブジェクトにインターフェースを実装します。

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

関連する問題