为Scala播放:ScalaTest中的模拟单例
我有以下播放控制器类,需要使用ScalaTest进行测试:为Scala播放:ScalaTest中的模拟单例,scala,playframework,playframework-2.0,scalatest,Scala,Playframework,Playframework 2.0,Scalatest,我有以下播放控制器类,需要使用ScalaTest进行测试: class RunFormula @Inject() (dbCache: DbCache) extends Controller { // some code } 类DbCache是一个单例: @Singleton class DbCache @Inject() (properties: Properties) { // some getters and setters } 这是一个测试类: class RunFo
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
一起正常工作
如何修复测试?您有两种方法可以解决此问题。 首先,如果要正确注入数据库并获得控制器实例,应执行以下操作:
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不使用依赖项注入来创建套件类。您必须手动构造测试的类。或者您可以使用guiceapi为您创建实例,但仍然需要手动调用它。注意:1)您需要DbCache的真实实例吗?也许你会想嘲笑它。2) 使用OneAppPerSuite会增加很多开销,您可能不需要运行应用程序进行单元测试。是的,我需要的是DbCache的真实实例,而不是模型。谢谢,但我不想注入数据库,我需要在控制器中注入单例类(
DbCache
),如果您想要数据库的实际实例,请使用:app.injector.instanceOf[DbCache]这就成功了:val DbCache=app.injector.instanceOf[DbCache]