为Scala玩:ScalaTest中的模拟单例

时间:2017-04-27 19:41:19

标签: scala playframework playframework-2.0 scalatest

我有以下需要使用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

}

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

请注意,控制器RunFormula可以在非测试场景中注入dbCache

如何修复测试?

1 个答案:

答案 0 :(得分: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)