我正在使用JUnit为测试数据库上运行的某些方法编写测试.我需要在每次@Test之后将数据库重置为原始状态.我想知道最好的方法是什么.EntityManager中有一些方法吗?或者我应该手动删除所有内容还是使用SQL语句?删除并...

我正在使用JUnit为测试数据库上运行的某些方法编写测试.
我需要在每次@Test之后将数据库重置为原始状态.我想知道最好的方法是什么.
EntityManager中有一些方法吗?或者我应该手动删除所有内容还是使用SQL语句?删除并重新创建整个数据库会更好吗?
解决方法:
我过去使用的一种技术是通过简单地从标准的“测试数据库”复制数据库并在测试中使用它来从头开始重新创建数据库.
这项技术适用于:
>你的架构没有太大变化(否则很难保持一致)
>你正在使用像hibernate这样合理的数据库独立性.
这具有以下优点:
>它适用于管理自己的事务的代码.我的集成测试在junit下运行.例如,当我测试批处理时,我从junit调用Batch.main(),并测试之前和之后的内容.我不想更改被测代码中的事务处理.
>速度相当快.如果文件足够小,那么速度不是问题.
>它使ci服务器上的运行集成测试变得简单.使用代码签入数据库文件.无需启动和运行真正的数据库.
以下缺点:
>测试数据库文件需要与真实数据库一起维护.如果你一直在添加列,这可能会很痛苦.
>有管理jdbc网址的代码,因为它们会针对每个测试进行更改.
我使用Oracle作为生产/集成数据库,hsqldb作为测试数据库.它工作得很好. hsqldb是一个单独的文件,因此很容易复制.
因此,在@Before中,使用hsqldb,将文件复制到target / it / database / name_of_test.script等位置.这在测试中被选中.
在@After中,你删除文件(或者只是留下它,谁在乎).使用hsqldb,您还需要执行SHUTDOWN,以便删除该文件.
您还可以使用从ExternalResource扩展的@Rule,这是管理资源的更好方法.
另一个提示是,如果您正在使用maven或类似的东西,您可以在目标中创建数据库.我使用target / it.这样,当我这样做并清除mvn时,数据库的副本就会被删除.对于我的批次,我实际上将所有其他属性文件等复制到此目录中,因此我也不会在奇怪的地方出现任何文件.
本文标题为:java – 在测试数据库操作时将数据库重置为已知状态的最佳方法是什么?


基础教程推荐
- JavaWeb Servlet中Filter过滤器的详解 2023-07-31
- jsp获得本地及serverIP的简单方法 2023-08-02
- Java数据结构之双向链表的实现 2023-06-23
- 详解Spring系列之@ComponentScan自动扫描组件 2023-01-03
- SpringBoot中使用Servlet的两种方式小结 2023-02-26
- Java 逻辑控制详解分析 2023-08-10
- 基于javaweb+jsp实现企业车辆管理系统 2023-07-30
- 老生常谈Java中List与ArrayList的区别 2023-05-07
- springboot集成shiro自定义登陆过滤器方法 2023-03-31
- javaWeb连接数据库实现简单登陆注册功能的全过程 2023-01-13