Scala Play + Slick: Как внедрить зависимости в тесты Spec? - PullRequest
0 голосов
/ 26 мая 2019

Я использую Scala Play 2.7.x (проект доступен здесь, Play-Silhouette-Seed ) и хотел бы проверить мои даос.Сначала я собрал этот простой, чтобы проверить, что такое «новый шаблон» для тестирования play + slick + guice в 2.7.x:

package models.daos

import java.util.UUID
import org.specs2.mock._
import org.specs2.mutable._
import utils.AwaitUtil
import javax.inject.Inject
import models.generated.Tables.LoginInfoRow

class LoginInfoDaoSpec @Inject() (loginInfoDao: LoginInfoDao) extends Specification with Mockito with AwaitUtil {

  "Creating a new LoginInfo" should {
    "save it in the empty database" in {
      loginInfoDao.create(LoginInfoRow(0, UUID.randomUUID().toString, UUID.randomUUID().toString))
      loginInfoDao.findAll.size should beEqualTo(1)
    }
  }
}

К сожалению, зависимость от guice LoginInfoDao не предоставляетсямой тест и затем я получаю сообщение об ошибке:

[play-silhouette-seed] $ testOnly models.daos.LoginInfoDaoSpec
[info] Done compiling.
[error] Can't find a suitable constructor with 0 or 1 parameter for class models.daos.LoginInfoDao
[info] ScalaTest
[info] Run completed in 1 second, 966 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[error] Error: Total 1, Failed 0, Errors 1, Passed 0

Как получить подсказку, загружая необходимые модули для моих тестовых случаев?

Модуль определяется как:

class SilhouetteModule extends AbstractModule with ScalaModule {
  override def configure() {
    // ...
    bind[LoginInfoDao].to[LoginInfoDaoImpl]
    // ...
  }
}

и у меня есть application.test.conf доступный, определенный как:

include "application.conf"

slick.dbs {
  default {
    profile="slick.jdbc.MySQLProfile$"
    db.driver="com.mysql.cj.jdbc.Driver"
    db.url="jdbc:mysql://localhost:3306/mytestdb?useUnicode=true&searchpath=public&serverTimezone=CET"
    db.user="dev"
    db.password="12345"
  }
}

1 Ответ

2 голосов
/ 26 мая 2019

Вы должны использовать другую базу данных для тестирования, H2 является наиболее распространенным выбором.

class Module extends AbstractModule with ScalaModule {
...
}

С этим именем вы должны сообщить play, что есть модуль для загрузки, если вы называете его модулем, он автоматически знает, что загружать, и должен работать нормально (если вам нужен только 1 модуль в тестировании)

Если это не сработает, дайте мне знать

...