Play Slick:如何在测试中注入DbConfigProvider



我使用的是Play 2.5.10、Play slick 2.0.2,我的激活程序生成的项目附带了scalatest和类似的代码:

class TestSpec extends PlaySpec with OneAppPerSuite {...}

我设法测试了路线/行动;现在我将在较低级别上测试DAO方法。我在网上和SO上搜索了一个解决方案,但找不到任何最新的解决方案。DAO签名如下:

class TestDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile]

所以我需要把dbConfigProvider的东西传给它。出于某种原因,我不能像在控制器中那样将提供者注入测试中(没有错误,测试就是无法运行):

class TestSpec @Inject()(dbConfigProvider: DatabaseConfigProvider) extends PlaySpec with OneAppPerSuite {...}

Play Slick文档表示,我们也可以使用全局查找

val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

但它不能直接工作,因为

没有启动的应用程序

并链接到一个这样做的示例项目:

class TestDAOSpec extends Specification {
"TestDAO" should {
"work as expected" in new WithApplicationLoader {   // implicit 'app'
val app2dao = Application.instanceCache[TestDAO].apply(app)

但我一直找不到CCD_ 2。相反,似乎有一个WithApplication:

class TestDAOSpec extends Specification {
"TestDAO" should {
"work as expected" in new WithApplication() {   // implicit 'app'
val app2dao = Application.instanceCache[TestDAO].apply(app)

但后来我得到

类型不匹配:应为play.api.Application,得到:play。应用

在这一点上,我失去了希望。

如何测试DAO

注意:我不需要切换数据库进行测试(我通过配置来处理),我只想在测试中访问默认数据库。

您可以使用:

lazy val appBuilder: GuiceApplicationBuilder = new GuiceApplicationBuilder().in(Mode.Test) 
lazy val injector: Injector = appBuilder.injector()
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider]

最新更新