Scala Play + Slick:如何将依赖项注入规范测试?
Scala Play + Slick: How to inject dependencies to Spec tests?
我正在使用 Scala Play 2.7.x(该项目可用 here Play-Silhouette-Seed)并且想测试我的 daos。我先把这个简单的放在一起来检查 2 中用于测试 play + slick + guice 的 "new pattern" 是什么。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
如何让 guice 为我的测试用例加载所需的模块?
一个模块定义为:
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"
}
}
您应该使用其他数据库进行测试,H2 是常见的选择。
class Module extends AbstractModule with ScalaModule {
...
}
使用这个名称你需要让游戏知道有一个模块要加载,如果你称它为模块,它会自动知道要加载什么并且应该可以正常工作(如果你只需要 1 个模块进行测试)
如果还是不行请告诉我
我正在使用 Scala Play 2.7.x(该项目可用 here Play-Silhouette-Seed)并且想测试我的 daos。我先把这个简单的放在一起来检查 2 中用于测试 play + slick + guice 的 "new pattern" 是什么。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
如何让 guice 为我的测试用例加载所需的模块?
一个模块定义为:
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"
}
}
您应该使用其他数据库进行测试,H2 是常见的选择。
class Module extends AbstractModule with ScalaModule {
...
}
使用这个名称你需要让游戏知道有一个模块要加载,如果你称它为模块,它会自动知道要加载什么并且应该可以正常工作(如果你只需要 1 个模块进行测试)
如果还是不行请告诉我