【发布时间】:2017-03-07 07:18:47
【问题描述】:
这是关于我正在尝试将 Guice 引入的 Play 2.3 应用程序。 我有以下 Guicify 遗留代码,我达到了这一点
class DatabaseService {
def db: Database = DB(play.api.Play.current)
//More code below.
}
这个类被注入到被测类中,比如 com.TestA。
当我使用修改后的 OneAppPerTest 设置运行测试用例时,我看到了以下类型的 ProvisionExceptions。
Error injecting constructor, java.lang.RuntimeException: There is no started application
是因为play.api.Play.current的使用吗?
我该如何解决这个问题?
其他信息 被覆盖的 OneAppPerTest 变体,使用以下逻辑
override def newAppForTest(testData: TestData): FakeApplication = {
new FakeApplication(
additionalConfiguration = additionalConfiguration,
withGlobal = Some(globalSettings)
)
}
additionalConfiguration 可以被实际测试覆盖,globalSettings 是在框架中引入 Guice 的地方
protected def globalSettings = {
new TestGlobalSettings {
val injector = Guice.createInjector(overriddenModules: _*)
override def getControllerInstance[A](controllerClass: Class[A]): A = {
injector.getInstance(controllerClass)
}
override def getInjector = {
injector
}
}
}
还有其他具有类似设置的测试用例可以正常工作。我能够注入模拟,测试类。但是,使用此 DatabaseService 类的每个测试都失败了,因为我无法干净地注入它。
【问题讨论】:
-
如果
DatabaseService被注入,为什么不注入DB呢? -
尚未尝试。我假设这也需要注入
Application。然而,事实证明这是一个隐式参数。我会尝试你提到的并回复你。 -
@rethab DB 不是可注入属性。它更像是一种创建数据库的方法。数据库不容易注入,因为它没有无参数构造函数。
-
可能不是直接
DB,但是这个? playframework.com/documentation/2.5.x/… -
这个类在 Play 2.3.x 中是不同的。数据库不是“可注入的”(由非 guiced 版本的 Slick 提供)。
标签: scala dependency-injection playframework guice scalatest