Спецификация интеграции play 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 считывает свойства db из файла конфигурации, расположенного по адресу /conf/application.conf.

Настройка моего проекта немного отличается от этой, так как у нас есть несколько сред, поэтому у нас есть такие файловые структурирования, как:

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

Когда мы запускаем приложение для воспроизведения с помощью команды типа: activator run -Dconfig.resource=/conf/local/application.conf, и все работает нормально. Я хочу сделать то же самое для спецификации интеграции, например: activator test -Dconfig.resource=/conf/local/application.conf. Play прочитает указанную конфигурацию для запуска интеграционных тестов.

Как лучше всего этого добиться?


person ttt    schedule 15.10.2015    source источник


Ответы (1)


Вы должны создать черту и смешать ее в тесте, и тогда она будет работать.

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

person insan-e    schedule 26.02.2016