为Slick数据库服务注入Play应用程序

时间:2017-03-07 07:18:47

标签: scala dependency-injection playframework guice scalatest

这是关于我试图将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类的每个测试都会失败,因为我无法完全注入它。

1 个答案:

答案 0 :(得分:0)

问题与Guice如何创建对象以及何时创建有关。这里的DatabaseService可以访问当前的应用程序,即当前的配置。但是,在我的Global.scala中,我在实际调用'onStart'之前注入了它。 这意味着我们正在尝试在正确初始化之前访问应用程序。

在测试类lazy中进行DatabaseService注入有助于避免错误。