单元测试中的HSQLDB(Scalatest / JUnitRunner)

时间:2012-01-06 19:59:01

标签: scala hsqldb scalatest

作为WordSpec的一部分,我有几个测试。从我对Scalatest文档的阅读中,这应该创建一套测试。正在为此文件中的每个测试用例重新启动HSQLDB。

@RunWith(classOf[JUnitRunner])
class UserAgentTest extends WordSpec with BeforeAndAfterAll {

  val userService: UserService = new UserServiceJpaImpl
  var userAgent: ActorRef = _
  var user: MutableUser = _

  override def beforeAll(configMap: Map[String, Any]) {
    TestUtil.deleteAllTestUsers()
    user = TestUtil.createTestUser("joe")
    user.cash = 500
    user.exp = 10000
    user.level = 10
    userService.save(user)

    userAgent = actorOf(new UserAgent(user.id)).start()
  }

  override def afterAll(configMap: Map[String, Any]) {
      if (userAgent != null)
        userAgent.stop()
  }

  "UserAgent" must {
    "test 1..." in { ... }
    "test 2..." in { ... }
  }

}

结果是在测试2中不存在在beforeAll中加载的测试数据。我可以通过初始化每个测试的DB(使用“before”而不是“beforeAll”)来完成这项工作。这对于像这样的小测试来说不是问题,但稍后可能会出问题。我正在使用Maven运行它(它在我的IDE中运行时出现问题)

我还注意到,当我运行“mvn test”时,它似乎为我的所有测试创建了一个HSQLDB实例(意思是,我上面的例子将会成功)。当我以“mvn test -Dtest = UserAgentTest”运行上述测试时,它将失败(它似乎创建了多个HSQLDB实例)。

不幸的是,使用“mvn test”运行会导致我的其他一些测试失败,因为单个HSQLDB实例用于我的所有测试套件。

我的问题是,如何让我的测试设置为每个测试套件创建一个(且只有一个)HSQLDB实例。

1 个答案:

答案 0 :(得分:0)

对于所有测试使用单个HSQLDB实例,如果某些测试套件需要以空数据库开头,则可以发出此语句以清除每个套件开头或结尾的旧数据,具体取决于设置: / p>

DROP SCHEMA PUBLIC CASCADE

这也可以用于测试创建的任何模式。

其他选项包括连接到包含内存数据库的服务器,该服务器允许数据库在不同进程中执行多次执行。