【问题标题】:Play for Scala: Mock singleton in ScalaTestPlay for Scala:ScalaTest 中的模拟单例
【发布时间】:2017-09-25 18:28:29
【问题描述】:

我有以下需要使用 ScalaTest 测试的 Play Controller 类:

class RunFormula @Inject() (dbCache: DbCache) extends Controller  {
    // some code
}

DbCache 类是单例:

@Singleton
class DbCache @Inject() (properties: Properties) {
    // some getters and setters
}

这是测试类:

class RunFormulaTest extends PlaySpec with OneAppPerSuite with MockitoSugar {

    implicit override lazy val app = new GuiceApplicationBuilder().build

    @Inject val dbCache : DbCache = null

    val controller = new RunFormula(dbCache)

    // more test code

}

当我运行测试时,RunFormula 内的对象 dbCache 为空,我的理解是 Guice 在注入实例时会创建实例,但显然不是。

请注意,控制器RunFormula 在非测试场景中注入dbCache 可以正常工作。

如何修复测试?

【问题讨论】:

  • ScalaTest 不使用依赖注入来创建您的套件类。您必须手动构建您测试的类。或者您可以使用 Guice api,以便它为您创建实例,但您仍然必须手动调用它。不过有几点注意事项:1)您需要真实的 DbCache 实例吗?也许你想嘲笑它。 2)使用OneAppPerSuite会增加很多开销,您可能不需要运行应用程序进行单元测试。
  • 是的,我需要 DbCache 的真实实例,而不是模型。

标签: scala playframework playframework-2.0 scalatest


【解决方案1】:

您有几种方法可以做到这一点。 首先,如果您想获得正确注入数据库的控制器实例,您应该执行以下操作:

val app = new GuiceApplicationBuilder().build
val controller = app.injector.instanceOf[RunFormula]

这将为您提供包含数据库的实例。 您可以通过在 application.conf 文件中设置适当的属性来控制测试模式下数据库的连接。

您还可以使用可以自己创建的数据库实例来创建控制器的实例:

val dbUrl = sys.env.getOrElse("DATABASE_URL", "jdbc:postgresql://localhost:5432/yourdatabase?user=username&password=password")
val database = Databases("org.postgresql.Driver", dbUrl,"testingzzz")
val controller = new RunFormula(database)

【讨论】:

  • 谢谢,但我不是在寻找注入数据库,我需要在控制器中注入一个单例类(在我的示例中为DbCache)..
  • 这是我在第一个代码示例中展示的内容,如果您想要数据库的实际实例,请使用:app.injector.instanceOf[DbCache]
  • 这成功了:val dbCache = app.injector.instanceOf[DbCache]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多