我在我的项目中使用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