为Scala播放:Scalatest中的模拟Singleton



我有以下我需要用scalatest测试的播放控制器类:

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为null,我的理解是,Guice会在注射时创建实例,但显然不是。

请注意,控制器RunFormula与在非测试方案中注入的dbCache正确工作。

如何修复测试?

您有几种方法。首先,如果要正确注入数据库的控制器的实例,则应该执行这样的操作:

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

这将为您提供数据库的实例。您可以通过在应用程序中设置适当的属性来控制数据库的连接。

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

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)

最新更新