玩scala集成规范-通过Guice注入依赖



我在我的项目中使用Scala, Play 2.4和Slick 3。我有以下DAO代码,它从端到端工作得很好。

@Singleton()
class CompaniesDAO @Inject() (protected val dbConfigProvider: DatabaseConfigProvider) extends CompaniesComponent
  with HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._
}

然而,由于dbConfig的东西,我不能让它在我的集成测试中像预期的那样工作。我的集成测试如下:

class CompaniesDaoIntegrationSpec extends FunSpec with OneServerPerSuite {
    def companiesDao(implicit app: Application) = {
      val app2CompaniesDAO = Application.instanceCache[CompaniesDAO]
      app2CompaniesDAO(app)
    }
    describe("create") {
        it("should create ") {
            companiesDao.create...
        }
    }
}

如果我没有把db属性放在application.conf中,我得到了以下错误:

[info]   java.lang.RuntimeException: com.google.inject.ProvisionException: Unable to provision, see the following errors:
[info]
[info] 1) No implementation for play.api.db.slick.DatabaseConfigProvider was bound.
[info]   while locating play.api.db.slick.DatabaseConfigProvider
[info]     for parameter 0 at

似乎给定上述代码,Play应用程序从位于/conf/application.conf的配置文件中读取db属性。

我的项目设置与此有点不同,因为我们有多个环境,所以我们有这样的文件结构:

/conf/local/application.conf
/conf/testing/application.conf
/conf/staging/application.conf
/conf/production/application.conf

当我们使用像:activator run -Dconfig.resource=/conf/local/application.conf这样的命令运行play应用程序时,一切都工作正常。我想对像activator test -Dconfig.resource=/conf/local/application.conf这样的集成规范做同样的事情。Play将读取指定的配置以运行集成测试。

实现这一目标的最佳方法是什么?

你必须创造一个特征并将其混合在测试中,然后它就会起作用。

trait WithDatabaseConfig {
    lazy val (driver, db) = {
        val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
        (dbConfig.driver, dbConfig.db)
    }
}

我不知道为什么,我是Scala初学者。可能需要做一些不运行的应用程序或Guice。在https://github.com/playframework/play-slick/blob/1.1.x/samples/json/test/DBSpec.scala

的样本文件夹中找到的。

最新更新