2016-08-01 4 views
1
における暗黙のクラスを持つユニット

は私がサービスを持っている想像してみて特定のアドホック拡張。テストScalaの

ここでは、serviceB.sendが呼び出されたことを確認する非常に簡単な単体テストを書きたいと思います。

そのため、私はserviceを模倣し、Asendに偽装しました。それから私はちょうどserviceB.sendが嘲笑されたAと呼ばれたと主張することができた。

例のように、sendメソッドもtypeAパラメータの変換を行いますので、指定した値を返すようにextractメソッドをモックする必要があります。ただし、Aにはextractメソッドがありません。これはimplicit classからのものです。

ですから、上記の例のように暗黙のクラスを模倣するにはどうすればよいですか?インポートはファーストクラスの市民ではないからです。

答えて

0

カスタマイズ抽出方法の束を指定したい場合は、あなたがこのような何か行うことができます。

sealed trait Extractor[T] { 
    // or whatever signature you want 
    def extract(obj: T): String 
} 
object Extractor { 

    implicit case object IntExtractor extends Extractor[Int] { 
    def extract(obj: Int): String = s"I am an int and my value is $obj" 
    } 
    implicit case object StringExtractor extends Extractor[String] { 
    def extract(obj: String): String = s"I am " 
    } 

    def apply[A : Extractor](obj: A): String = { 
    implicitly[Extractor[A]].extract(obj) 
    } 

} 

をだから、基本的にのみ間違いなくある場合のオブジェクトを介して、事前にマテリアライズドだ密閉型の家族がいますmatchで有用である。しかし、それはすべてを切り離すことができます。

これをExtractorと混同したくない場合は、別の名前を付けて同じ方法を実行して、すべてをコンテキストバインドで混在させることができます。必要であれば、単純に利用できる暗黙の上書き、テストのために

println(Extractor(5)) 

次にあなたがこれを使用することができます。少し仕事がありますが、不可能ではありません。あなたは単にスコープを制御するだけで、あなたが望むどんなメソッド呼び出しでも偵察することができます。例えばimport Extractor._の代わりに、モックまたは代替実装を使用できるテスト専用ロジックを持つ他のオブジェクトがあります。

関連する問題