2016-08-01 23 views
1
測試一個單元具有隱式類

想象我有一個服務:Scala中

class ServiceA(serviceB: ServiceB) { 

    import Extractor._ 

    def send(typeA: A) = serviceB.send(typeA.extract) 

} 

object Extractor { 
    implicit class Extractor(type: A) { 
     def extract = ??? 
    } 
} 

我想被隱式定義的extract方法,因爲它不直接涉及A類型/結構域和是溶液具體adhoc擴展。

現在我想寫一個非常簡單的單元測試,確認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) 
    } 

} 

所以你基本上是一個密閉型家族的pre-物化通過個案對象,只可以說是在match有用。但那會讓你解開一切。

如果您不想與Extractor混合使用,請將它們稱爲其他內容並遵循相同的方法,然後您可以將其與上下文綁定混合。

然後你就可以使用這項功能:

println(Extractor(5)) 

爲了測試,只需覆蓋可用implicits如果您需要。有點工作,但不是不可能的,你可以簡單地控制範圍,你可以監視任何你想要的方法。

例如,而不是import Extractor._有一些其他對象,只測試邏輯,您可以使用模擬或替代實現。