如何绑定依赖注入的系统包装器来播放应用程序控制器?

时间:2016-12-15 00:23:20

标签: playframework dependency-injection mocking guice inject

我的应用程序依赖于从特征SystemComponent继承的自定义类。

package com.example 
trait SystemWrapper { ... }
trait MySystemWrapper extends SystemWrapper { ... } 

class RealSystemWrapper extends MySystemWrapper { dao: RealDAOFactory =>
  val blah = new MySystem("Production")
}

在我的Application.scala注入RealSystemWrapper工作并编译得很好,但不能帮助我进行测试:

class Application @Inject() (syswrap: RealSystemWrapper) extends Controller
{ 
 ...// use syswrap here
}

我想使用MockedSystemWrapper extends SystemWrapper与模拟的DAO工厂等等。因此我想像这样注入特征SystemWrapper

class Application @Inject() (syswrap: SystemWrapper) extends Controller 
{ 

但是我得到了ProvisionException:没有绑定任何实现

1) No implementation for com.example.SystemWrapper was bound.
  while locating com.example.SystemComponent
    for parameter 0 at com.example.controllers.Application.<init>(Application.scala:25)
  while locating com.example.controllers.Application
    for parameter 1 at router.Routes.<init>(Routes.scala:27)
  while locating router.Routes
  while locating play.api.inject.RoutesProvider
  while locating play.api.routing.Router
    for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200)
  while locating play.api.http.JavaCompatibleHttpRequestHandler
  while locating play.api.http.HttpRequestHandler
    for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221)
  at play.api.DefaultApplication.class(Application.scala:221)
  while locating play.api.DefaultApplication
  while locating play.api.Application

播放文档建议我使用@ImplementedBy[classOf[RealSystemWrapper]]装饰器,但这给我留下了测试问题:如何在测试时将其更改为classOf[MockedSystemWrapper]

1 个答案:

答案 0 :(得分:2)

由于Application取决于特征,您需要定义&#34;绑定&#34; (即,使用哪个具体类)。正如您所描述的,一种方法是@ImplementedBy注释。另一种方法是在模块中定义绑定,如下所述:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Programmatic-bindings

现在,如果您想在测试中使用其他实例,则这取决于您的测试设置。在最简单的情况下,您可以直接在测试中实例化Application,因此您可以手动传递模拟。如果您正在运行您所在的整个应用程序,那么您可以覆盖绑定(如此处所述:https://www.playframework.com/documentation/2.5.x/ScalaTestingWithGuice#Override-bindings)或将重写的模块传递给WithApplication帮助程序(如下所示:{{ 3}})