I am wondering what people have found their best practice to be for testing Hibernate mappings and queries ?
This cannot be done with Unit Testing, so my experience has been to write Integration Tests that solely tests the DAO layer downwards. This way I can fully test each Insert / Update / Delete / ReadQueries without testing the full end-to-end solution.
Whenever the Integration test suite is run it will:-
- Drop and re-create the database.
- Run an import SQL script that contains a subset of data.
- Run each test in a Transactional context that rolls back the transaction. Therefore it can be run multiple times as an independent test, or and as part of a suite, and the same result is returned as the database is always in a known state.
I never test against a different “in memory” database, as there is always an equivalent development database to test against.
I have never had the need to use DBUnit.
Never use DbUnit for this. It’s way too much overhead for this level of testing.
Especially if you’re using Spring in your app, check out the Spring Test Framework to help manage your data-access tests, particularly the transaction management features.
An “equivalent development database” is fine, but an in-memory H2 database will blow away anything else for speed. That’s important because, while the unit/integration status of these tests may be contested, they’re tests you want to run a lot, so they need to be as fast as possible.
So my DAO tests look like this:
SessionFactoryandTransactionManager.foo1, save it, load it asfoo2, verifyfoo1andfoo2contain identical values.)Very lightweight and useful for quick feedback.