簡體   English   中英

在Scala中使用隱式類測試單元

[英]Testing a unit with implicit class in 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類型/域相關,並且是特定於解決方案的特殊擴展。

現在我想編寫一個非常簡單的單元測試,確認調用了serviceB.send

為此,我模擬service並通過模擬A send 然后我可以斷言使用serviceB.sendA調用serviceB.send

如示例所示, send方法也對typeA參數進行了一些轉換,因此我需要模擬extract方法來返回指定的值。 但是, A沒有extract方法 - 它來自implicit class

所以問題是 - 我如何模仿上面示例中的隱式類,因為導入不是一等公民。

如果要指定一組自定義提取方法,可以執行以下操作:

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

}

所以你基本上有一個密封型系列,通過case對象預先實現,可以說只在match有用。 但這會讓你解開一切。

如果您不想將其與Extractor混合使用,請將其稱為其他內容並按照相同的方法,然后您可以將其全部與上下文綁定混合。

然后你可以使用它:

println(Extractor(5))

對於測試,如果需要,只需覆蓋可用的含義。 一些工作,但並非不可能,你可以簡單地控制范圍,你可以窺探你想要的任何方法調用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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