【发布时间】:2013-06-21 14:27:19
【问题描述】:
我想为 Play 2 Scala 应用程序运行单元测试,使用的数据库设置与生产环境中使用的相同:Slick with Postgres。以下失败并显示“java.sql.SQLException:尝试从已关闭的池中获取连接”。第二次测试。
package controllers
import org.specs2.mutable._
import play.api.db.DB
import play.api.Play.current
import play.api.test._
import play.api.test.Helpers._
import scala.slick.driver.PostgresDriver.simple._
class BogusTest extends Specification {
def postgresDatabase(name: String = "default",
options: Map[String, String] = Map.empty): Map[String, String] =
Map(
"db.test.driver" -> "org.postgresql.Driver",
"db.test.user" -> "postgres",
"db.test.password" -> "blah",
"db.test.url" -> "jdbc:postgresql://localhost/blah"
)
def fakeApp[T](block: => T): T =
running(FakeApplication(additionalConfiguration =
postgresDatabase("test") ++ Map("evolutionplugin" -> "disabled"))) {
def database = Database.forDataSource(DB.getDataSource("test"))
database.withSession { implicit s: Session => block }
}
"Fire 1" should {
"do something" in fakeApp {
success
}
}
"Fire 2" should {
"do something else" in fakeApp {
success
}
}
}
我这样运行测试:
$ play -Dconfig.file=`pwd`/conf/dev.conf "test-only controllers.BogusTest"
另外两个谜团:
1) 所有测试都运行,即使我只要求运行 BogusTest
2) 始终使用application.conf,而不是def.conf,驱动信息来自application.conf,而不是代码中配置的信息。
【问题讨论】:
-
查看stackoverflow.com/questions/15399161/… 了解如何使用
test指定不同的配置文件。 -
谢谢,看起来这应该解决神秘问题 #2。你能解释一下主要问题吗?
-
我也遇到了同样的问题。即使不使用 specs2 中的 Around 特征,并且简单地包裹在
in{ running(fakeApp) {Database.forDataSource(DB.getDataSource()) withSession {}} }内也会产生此异常。 -
我想我有你的答案,但是请发布一个带有 h2 和所有依赖项的 github 项目,以便我可以在向论坛发送垃圾邮件之前进行测试:)
-
在 dev conf 中启用日志记录然后发布测试运行的日志可能会有所帮助。
标签: scala playframework playframework-2.1 slick specs2