我的应用程序依赖于从特征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]
?
答案 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}})