【问题标题】:Injecting Play Application for a Slick Database Service为 Slick 数据库服务注入 Play 应用程序
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2016-03-03
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多