这与我试图将GUICE引入的应用程序有关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
吗?我该如何解决此问题?
附加信息覆盖的oneappertest变体,使用以下逻辑
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
}
}
}
还有其他具有类似设置的测试用例可以很好地工作。我能够注入模拟,测试课程。但是,此数据库服务类的每个测试都失败了,因为我不能干净地注入。
问题与Guice如何创建对象和何时相关。此处的数据库服务可以访问当前应用程序,即当前配置。但是,在我的global.scala中,我在" onstart"之前被注入了它。这意味着我们正在尝试在适当初始化应用程序之前访问该应用程序。
在测试类lazy
中进行数据库服务注入有助于避免错误。