4
votes

I use Scala, Play 2.4, and Slick 3 in my project. I have following DAO code and it works fine from end to end.

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

However, I can't get it working as expected in my integration test because of dbConfig stuff. My integration test is below:

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...
        }
    }
}

If I don't put db properties in application.conf I got the following error:

[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

It seems given the above code, Play application reads the db properties from configuration file which is located at /conf/application.conf.

My project setup is a bit different to this, as we have multiple environments so we have file structuers like:

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

When we run the play application using command like: activator run -Dconfig.resource=/conf/local/application.conf and everything work fine. I want to do the same for integration spec like: activator test -Dconfig.resource=/conf/local/application.conf. Play will read the specified config to run integration tests.

What's the best way to achieve that?

1

1 Answers

0
votes

You have to make a trait and mix it in the test, and then it will work.

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

I have no idea why, I'm a Scala beginner. Probably has to do something with not/running app or Guice. Found it in their samples folder at https://github.com/playframework/play-slick/blob/1.1.x/samples/json/test/DBSpec.scala