Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How should I reset a JPA-controlled database before every test?

Is there a best-practice pattern for completely resetting a database to a freshly-paved schema with JPA before a unit test? I have been using a testing persistence unit with hbml2ddl.auto=create-or-drop and recreating EMFs before each test, but I wonder if there's a cleaner way to do it.

like image 739
HenryR Avatar asked Oct 25 '22 07:10

HenryR


2 Answers

Unit tests should not talk to the database.

Assuming you're writing an integration test for your data access layer, you could use a tool like DBUnit, or you could create a static test helper that programmatically resets your database state by doing all of your deletes and inserts using JPA queries inside of a transaction.

like image 90
Javid Jamae Avatar answered Nov 09 '22 09:11

Javid Jamae


Resetting the database is not a big problem if you use a fast Java database such as the H2 database or HSQLDB. Compared to using Oracle / MySQL (or whatever you use for production) this will speed up your tests, and it will ensure all your code is tested as when using the 'real' production database.

For maximum performance, you can use H2 in-memory (that way you may not have to reset the database manually - it's reset automatically if the connection is closed), or you can use a regular persistent database. To reset the database after use in H2, run the (native) statement 'drop all objects delete files'.

like image 22
Thomas Mueller Avatar answered Nov 09 '22 09:11

Thomas Mueller