Play for Scala:在 ScalaTest 中模拟单例
Play for Scala: Mock singleton in ScalaTest
我有以下需要使用 ScalaTest 测试的 Play Controller class:
class RunFormula @Inject() (dbCache: DbCache) extends Controller {
// some code
}
classDbCache
是单例:
@Singleton
class DbCache @Inject() (properties: Properties) {
// some getters and setters
}
这是测试 class:
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
一起正常工作。
如何修复测试?
您有几种方法可以做到这一点。
首先,如果你想获得正确注入数据库的控制器实例,你应该这样做:
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)
我有以下需要使用 ScalaTest 测试的 Play Controller class:
class RunFormula @Inject() (dbCache: DbCache) extends Controller {
// some code
}
classDbCache
是单例:
@Singleton
class DbCache @Inject() (properties: Properties) {
// some getters and setters
}
这是测试 class:
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
一起正常工作。
如何修复测试?
您有几种方法可以做到这一点。 首先,如果你想获得正确注入数据库的控制器实例,你应该这样做:
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)