0

作为 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 中的测试数据。我可以通过为每个测试初始化​​数据库来完成这项工作(使用“before”而不是“beforeAll”)。对于这样的小测试来说,这不是问题,但以后可能会成为问题。我正在使用 Maven 运行它(从我的 IDE 内部运行时会出现问题)

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

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

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

4

1 回答 1

0

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

DROP SCHEMA PUBLIC CASCADE

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

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

于 2012-01-07T11:11:28.863 回答