在我的Play 2.6.x应用程序中,我正在使用PlaySpec
进行测试。现在我想注入一些在测试代码中使用的对象。
class AuthControllerTest @Inject()(userRepository: UserRepository)
extends PlaySpec with GuiceOneAppPerSuite with Injecting {
"Foo bar" should {
"do xyz" in {
// do something with userRepository
}
}
}
但是,这个类永远不会被用于测试,例如运行时sbt test
。
一个简单的解决方法是从当前的Play实例手动获取注入器,但不推荐使用Play.current
并且它通常感觉很糟糕:
class AuthControllerTest
extends PlaySpec with GuiceOneAppPerSuite with Injecting {
"Foo bar" should {
"do xyz" in {
val userRepository = Play.current.injector.instanceOf[UserRepository]
// do something with userRepository
}
}
}
为什么前一个例子不起作用?是否有比后一个例子更清洁的方法?
答案 0 :(得分:2)
Play Framework不会像第一个示例那样为测试执行依赖项注入。在第二个问题上,您不需要Play.current
,因为GuiceOneAppPerSuite
可以向您提供应用程序(app
)。所以你可以这样做:
val userRepository = app.injector.instanceOf[UserRepository].
通过使用Injecting
,您可以进一步简化它:
val userRepository = inject[UserRepository]
如果测试类中的所有或大多数测试都需要一个Application,并且它们都可以共享相同的Application实例,那么将特质GuiceOneAppPerSuite与GuiceFakeApplicationFactory特征混合使用。 您可以从应用领域访问应用。
此处还有一个关于Injecting
的重点:
https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting