使用Hibernate和Spring Boot截断所有数据库表

时间:2018-06-20 18:20:52

标签: spring hibernate spring-boot integration-testing junit5

我需要在每次测试后截断所有数据库表。有没有办法做到这一点,或者至少有一种与数据库无关的方式来获取所有表名,以便可以将它们截断。

其他任何替代方法都可以使用。但是请记住,b''@Transactional对我正在处理在服务器上触发http请求的集成测试无济于事。

3 个答案:

答案 0 :(得分:2)

我认为您将难以以与数据库无关的简单方式截断表。例如,您如何处理外键约束?一些数据库将使您仅以正确的顺序截断表,从而使您面临如何定义该顺序的问题。但是,如果我没记错的话,即使是空的,有些也不会让您截断带有外键约束的表。然后,您需要使用一些特定于数据库的DDL来禁用约束,或者更糟的是删除并重新创建约束。

如果采用这种方法,您还不打算并行化集成测试。

我一直发现更好的方法是使每个测试仅清除其创建的数据。例如,对于您的create API,您可以注册一个侦听器,该侦听器在您的测试代码中记录所有已创建实体的ID,然后在拆卸时,您可以反向迭代该ID列表,调用{ 1}} API。这种方法的缺点是您可能需要实现应用程序实际上不需要的API,仅用于支持测试。但是,可以通过将其部署到生产中的标志来禁用这些功能。

答案 1 :(得分:0)

我从文本文件中读取了此属性,并在if语句中添加了2个休眠属性,该语句在每次执行项目时都会重新构建数据库,也许这可以为您提供帮助?

if (environment.getProperty("dbReset").compareTo("ON") == 0)
{
    properties.put("hbm2ddl.auto", "create");
    properties.put("hibernate.hbm2ddl.auto", "create");
}

答案 2 :(得分:0)

要在两次测试运行之间重置数据库状态,您可能会对spring-test-dbunit感兴趣。它是Spring和DBUnit之间的集成,允许您使用注释@DatabaseSetup@DatabaseTeardown设置和拆除数据库表。它有几种用于管理数据的策略,包括内容刷新,干净插入和截断。

这种方法允许您设置仅针对测试用例的数据,并在测试运行后清理所需的任何表。此外,它还允许您使用@ExpectedDatabase批注检查期望的数据。