这是关于我试图将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类的每个测试都会失败,因为我无法完全注入它。
答案 0 :(得分:0)
问题与Guice如何创建对象以及何时创建有关。这里的DatabaseService可以访问当前的应用程序,即当前的配置。但是,在我的Global.scala中,我在实际调用'onStart'之前注入了它。 这意味着我们正在尝试在正确初始化之前访问应用程序。
在测试类lazy
中进行DatabaseService注入有助于避免错误。