java - 使用 Hibernate/Spring/JUnit 设置和拆除复杂的数据库状态

标签 java hibernate spring junit

我有一个正在单元测试的类,它需要相当广泛的数据库设置才能运行各个测试方法。此设置需要很长时间:出于希望与手头问题无关的原因,我需要以编程方式而不是从 SQL 转储填充数据库。

我遇到的问题是拆解。如何轻松回滚在数据库设置阶段所做的所有更改?

我目前正在使用 Hibernate + Spring Transactional Testing 支持,这样我的个人测试方法就包含在事务中。

一个解决方案是在每个测试方法中进行数据库设置,这样数据库设置就会自动回滚。但是,测试方法将永远运行,因为每个方法都需要重新准备数据库。

还有其他想法吗?基本上,我正在寻找一种方法来运行我的数据库设置,运行我的个人测试(每个测试都包含在一个事务中,该事务在执行后回滚),然后回滚初始数据库设置。关于使它以 Hibernate/Spring/Junit 方式工作的任何想法?是否有 Hibernate 的“删除所有表”等效命令?

最佳答案

您是否受困于特定的数据库供应商?如果没有,您可以使用内存数据库,例如 HSQLDB .完成测试后,您只需丢弃状态。这仅适用于在测试套件开始时(即在您的编程设置之前)表格可以为空的情况。

您仍然需要创建表,但是如果所有内容都使用 Hibernate 整齐地映射,您可以使用 hbm2ddl 来生成您的表。您所要做的就是将以下内容添加到您的测试 session 工厂定义中:

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

如果这个解决方案看起来适用,我可以详细说明。

关于java - 使用 Hibernate/Spring/JUnit 设置和拆除复杂的数据库状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/822846/

相关文章:

java - 使用 Saxp 读取和 hibernate 保存大型数据库时 Netbean 没有响应

java - 使用 Spring MVC 的简单文件上传表单中的 NullPointerException

java - 如何在 SpringMVC 中提交页面时绑定(bind)对象属性?

java - 在Java中提取大写字符的最快方法

java - 如何删除java中最后输入的值?

java - 泛型..? super T

java - Spring - hibernate -org.hibernate.TransientObjectException:对象引用了一个未保存的临时实例

java - 是否可以要求抽象类的子类覆盖父类(super class)的继承方法?

java - 根据查询设置超时

database - 如何设计一个与自身具有多对多关系的表?