播放:如何将“Play.current”替换为 DI



在尝试编写测试时,我从Play收到以下警告:

您的作用域中没有隐式应用程序。如果要将当前正在运行的应用程序引入上下文,请使用依赖项注入。

我发现如果我添加此导入,它会神奇地解决范围内应用程序的问题:

import play.api.Play.current

但是它警告您

方法当前在对象中 Play 已弃用:这是对应用程序的静态引用,请改用 DI

如何使用依赖注入来获得相同的结果?这是我需要它的地方:

class TestSpec extends PlaySpec with OneAppPerSuite { ... }

编辑:我确实找到了这篇文章,但我看不出答案如何为我提供获得隐式Application的线索。

有人

向我指出了这个例子(通过@insan-e),它展示了如何解决这个问题。你不能注入测试类,但你"只需要"用这个覆盖你的PlaySpec

import javax.inject.{Inject, Singleton}
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec}
import play.api.Application
import play.api.inject.guice.GuiceApplicationBuilder
// To avoid repeating the `instanceCache` line below for each DAO
@Singleton
class DaoContext @Inject()(
                        val testDAO: TestDAO
                        // Other DAOs here
)
abstract class BetterSpec extends PlaySpec with OneAppPerSuite {
  implicit override lazy val app = new GuiceApplicationBuilder().configure(...).build
  protected def daoContext(implicit app: Application): DaoContext = {
    Application.instanceCache[DaoContext].apply(app)
  }
}

和测试:

class TestSpec extends BetterSpec {
  "Test DAO" should {
    "work" in {
      val dao = daoContext.testDAO
      // test it, finally
    }
  }
}

我知道,"到底是什么????"但它奏效了。

:注:现在它可以作为Play Slick的副本关闭:如何在测试中注入DbConfigProvider。

最新更新