【问题标题】:Scala Play + Slick: How to inject dependencies to Spec tests?Scala Play + Slick:如何将依赖项注入 Spec 测试?
【发布时间】:2019-05-25 21:22:51
【问题描述】:

我正在使用 Scala Play 2.7.x(该项目可用 here Play-Silhouette-Seed)并想测试我的 daos。我先把这个简单的放在一起来检查 2.7.x 中测试 play + slick + guice 的“新模式”是什么:

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

【问题讨论】:

  • 您可以查看Acolyte(我是贡献者),它允许为任何 JDBC 基础代码(如 Slick 用于 MySQL)代码设置隔离测试。

标签: scala playframework slick slick-3.0 play-framework-2.7


【解决方案1】:

您应该使用另一个数据库进行测试,H2 是常见的选择。

class Module extends AbstractModule with ScalaModule {
...
}

使用该名称,您需要让游戏知道有一个要加载的模块,如果您将其称为模块,它会自动知道要加载什么并且应该可以正常工作(如果您在测试中只需要 1 个模块)

如果这不起作用,请告诉我

【讨论】:

  • 谢谢!但我已经有一套 MySQL 进化脚本,它们在 H2 中不起作用。此外,我还设置了一个指向 MySQL 测试数据库的application.test.conf。重点不在于使用什么数据库,OP 的重点是如何让 Guice Inject 系统以最小的组件开销为我提供这些 Dao 依赖项,即无需为此加载整个应用程序组件。
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多