在尝试编写测试时,我从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。