1
我想在内存数据库使用此代码运行我的测试:Scala play:H2“HikariDataSource已关闭。”
class MySpec extends PlaySpec with OneAppPerSuite {
Databases.withInMemory(
name = "test",
urlOptions = Map(
"MODE" -> "MYSQL",
"DATABASE_TO_UPPER" -> "false",
"DB_CLOSE_DELAY" -> "-1"
),
config = Map(
"logStatements" -> true,
"lazyInit" -> true,
"username" -> "sa",
"password" -> ""
)
) { TestDb =>
"DataManagementController" should {"connect" in {
TestDb.withConnection(conn => 0) // do nothing, but connect
}}
}
}
,但我收到此错误:执行测试之前“HikariDataSource已关闭”:
[info] DataManagementController
[info] - should connect *** FAILED ***
[info] java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
[info] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:79)
[info] at play.api.db.DefaultDatabase.getConnection(Databases.scala:142)
[info] at play.api.db.DefaultDatabase.withConnection(Databases.scala:152)
[info] at play.api.db.DefaultDatabase.withConnection(Databases.scala:148)
[info] at ControllerSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(ControllerSpec.scala:37)
[info] at ControllerSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$mcV$sp$1.apply(ControllerSpec.scala:37)
[info] at ControllerSpec$$anonfun$1$$anonfun$apply$1$$anonfun$apply$mcV$sp$1.apply(ControllerSpec.scala:37)
[info] at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info] at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info] at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info] ...
我在做什么错?
谢谢!有用。你知道这种做法(为每个测试创建一个数据库实例)是否会增加性能开销/建议吗? – JulienD
是的,它确实(增加了开销)。在一般情况下,我认为这是可取的,每个测试有它的分贝,所以他们是独立的(即没有测试,在可以影响另一种方式变化的数据)。当然,如果你有很多测试,创建所有这些数据库将需要一些时间(特别是如果你应用迁移/种子数据)。你将不得不找到更适合你的东西。也许具有所有的测试,每间套房初始化,再利用一个数据库可以工作得很好(当然,如果你确保其他人需要一个测试不删/更新数据...) – Salem