Java 如何在junit测试中快速重新加载数据库数据?

Java 如何在junit测试中快速重新加载数据库数据?,java,spring,junit,hsqldb,Java,Spring,Junit,Hsqldb,我使用Spring和Hibernate用Java开发了一个应用程序。现在我正在寻找一种解决方案,用于在测试之间快速重新加载数据。测试需要大量数据,这些数据是通过服务生成和持久化的。作为数据库,我在内存中使用hsqldb。数据生成过程大约需要30秒,所以在每次测试之前运行它太长了 所以我想知道这是否是一个好主意,hsqldb是否可以在测试用例或套件开始时运行一次数据加载程序,然后在每次测试之前创建一个转储并恢复它?我找不到如何在hsqldb中创建转储,尤其是在内存db中 我感谢你的帮助 编辑:我必

我使用Spring和Hibernate用Java开发了一个应用程序。现在我正在寻找一种解决方案,用于在测试之间快速重新加载数据。测试需要大量数据,这些数据是通过服务生成和持久化的。作为数据库,我在内存中使用hsqldb。数据生成过程大约需要30秒,所以在每次测试之前运行它太长了

所以我想知道这是否是一个好主意,hsqldb是否可以在测试用例或套件开始时运行一次数据加载程序,然后在每次测试之前创建一个转储并恢复它?我找不到如何在hsqldb中创建转储,尤其是在内存db中

我感谢你的帮助

编辑:我必须使用数据库。让我们考虑它们的重新集成测试。

< P>可以在每次测试之前和之后使用数据库加载和清理,但我认为这不会提高您的性能。


相反,我会问为什么单元测试需要这么多数据?30秒对于实际命中数据库的集成测试来说并不太糟糕,但我认为您应该努力让单元测试根本不命中数据库,而是使用模拟对象来模拟与服务的交互。然后,您可以进行一些实际使用数据库的集成测试,但这些测试不必覆盖所有场景,因为更快的单元测试应该已经完成了

尝试在测试类中使用此注释

@TransactionConfiguration(transactionManager=“nameOfYourTransactionManager”,defaultRollback=true)


我发现它

您可以使用HSQLDB
文件:
数据库和默认内存表


生成数据集后,将属性
files\u readonly=true
添加到database.properties文件中。然后使用该数据库运行测试。这可以确保您的测试以与
mem:
数据库相同的方式运行和修改数据,但测试过程结束时不会保留测试所做的更改。原始数据以最快的方式在几秒钟内加载。

您是否考虑过在测试中模拟要访问的数据?这可能会快得多…+1对于注释,在为控制器或模型编写单元测试时,应该模拟数据库。。我认为,在为DAO层EP编写测试时,应该只与实际数据集交互。创建整个数据库显然是一种开销,您应该使用模拟数据。但是,如果您需要使用内存中的DB,可能只恢复您通过测试修改的记录(例如,您计划在测试中修改的缓存记录,并在测试完成后恢复其原始状态)。我使用的是dbUnit,但现在我改变了方式并使用测试数据生成器模式。我不想再有静态测试数据了。这些测试是集成测试。没有,我的所有测试都将使用此db重新加载机制。@Jan Hruby-我更喜欢恢复db起始版本的选项,而不是执行与测试中执行的相反的操作。有可能吗?您可以将事务存储到堆栈中,测试后只需对每个堆栈执行回滚。我不知道,是否可以自动使用一些注释/属性