WS (Web サービス) と呼ばれる (インポートされた) シングルトン インスタンスに依存するメソッドをテストしているとします。このインスタンスには、URL を受け取ってリクエストを返す メソッドurl(url: String)があります。
def doRequest(url: String): Future[Response] = {
val request = WS.url(url)
for {
response <- request.post(params)
} yield {
val res: JsResult[MyResult] = response.json.validate[MyResult]
res.getOrElse(throw new NotSupportedException)
}
}
単体テストで実際のアウトバウンド http 要求を必要とせず、代わりにモック WS インスタンスに依存できるように、WS 依存関係を注入できるようにしたいと考えています。
シングルトンには技術的に型 (Class[WS.type]) がありますが、Class[WS.type] を期待する val にシングルトンをバインドすると、WS のプロパティとメソッドが失われるため、これは私にとって課題でした。これは、次のように単純なケーキ パターンを単純に使用できないことを意味します。
trait WSComponent {
val ws: Class[_ <: WS.type]
}
object ApplicationContext extends WSComponent {
val ws = WS
}
object TestContext extends WSComponent {
val ws = mock[WS]
}
これを実行してから、いずれかのコンテキストで WS のメソッドを呼び出すと、Class[_ <: WS.type] には (たとえば) url() と呼ばれるメソッドがないというコンパイル エラーが発生します。
同様の理由のように思えますが (基本的に、シングルトン オブジェクトには型がありませんが、型はありません)、WS.type を受け取る暗黙のパラメーターを指定することはできません。シングルトン オブジェクトで宣言されたプロパティ。
シングルトン オブジェクトに依存関係を注入するには、どのようなアプローチがありますか? 私は DI にケーキ パターンを使用することを楽しんでいますが、コードにかなりのボイラープレートが導入されるため、理想的なソリューションはコードにボイラープレートを追加しすぎないことです。
ご提案いただきありがとうございます。