为Scala播放: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

我有以下播放控制器类,需要使用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
为空,我的理解是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]