【发布时间】:2018-06-20 18:20:51
【问题描述】:
我需要在每次测试后截断所有数据库表。有没有办法这样做,或者至少有一种与数据库无关的方法来获取所有表名,以便它们可以被截断。
欢迎任何其他选择。但请记住,@Transactional 和 @Rollback 无济于事,因为我正在处理在服务器上触发 http 请求的集成测试。
【问题讨论】:
标签: spring hibernate spring-boot integration-testing junit5
我需要在每次测试后截断所有数据库表。有没有办法这样做,或者至少有一种与数据库无关的方法来获取所有表名,以便它们可以被截断。
欢迎任何其他选择。但请记住,@Transactional 和 @Rollback 无济于事,因为我正在处理在服务器上触发 http 请求的集成测试。
【问题讨论】:
标签: spring hibernate spring-boot integration-testing junit5
我认为您将很难以一种简单的、与数据库无关的方式截断表。例如,您如何处理外键约束?一些数据库会让您以正确的顺序截断表,给您留下如何定义该顺序的问题。但如果我没记错的话,有些根本不会让你截断带有外键约束的表,即使是空的。然后,您需要使用一些特定于 DB 的 DDL 来禁用约束,或者更糟的是,删除并重新创建它们。
如果您采用这种方法,您还将排除并行化集成测试。
我一直发现更好的方法是让每个测试只清除它创建的数据。例如,对于您的create API,您可以注册一个侦听器,记录测试代码中所有已创建实体的 ID,然后在拆卸时您可以反向迭代此 ID 列表,调用您的 delete API .这种方法的缺点是您可能需要实现应用程序实际上不需要的 API,只是为了支持测试。然而,这些可以通过部署到生产的标志来禁用。
【讨论】:
我从一个文本文件中读取了这个属性,并在 if 语句中添加了 2 个休眠属性,每次执行我的项目时都会重建数据库,也许这可以帮助你?
if (environment.getProperty("dbReset").compareTo("ON") == 0)
{
properties.put("hbm2ddl.auto", "create");
properties.put("hibernate.hbm2ddl.auto", "create");
}
【讨论】: