I have a project which I am building with Maven which uses Hibernate (and Spring) to retrieve data from a database, etc.
My "tests" for the DAOs in my project extend Spring's AbstractTransactionalDataSourceSpringContextTests
so that a DataSource can be wired into my class under test to be able to actually run the query/Hibernate logic, to fetch data, etc.
On several other projects I've used these types of test in concert with a HSQL database (either in-memory or pointed at a file) to be able to efficiently test the actual database querying logic without relying on an external database. This works great, since it avoids any external dependencies and the "state" of the database prior to running the tests (each of which are wrapped in a transaction which is rolled back) is well defined.
I'm curious though about the best way to organize these tests, which are really a loose flavor of integration tests, with Maven. It feels a bit dirty to keep these tests in src/test/java
, but from what I've read there doesn't seem to be a consistent strategy or practice for organizing integration tests with Maven.
From what I've read so far, seems like I can use the Failsafe plugin (or a second instance of Surefire) and bind it to the integration-test
phase, and that I can also bind custom start-up or shutdown logic (such as for starting/stopping the HSQL instance) to pre-integration-test
or post-integration-test
. But, is this really the best method?
So my question basically is - what is the generally accepted best practice on organizing this with Maven? I'm having trouble finding any sort of consistent answer in the documentation.
What I'd like is to:
- Seperate unit tests from integration tests, so only unit tests are run during the
test
phase - The ability to bind custom startup/shutdown logic to
pre-integration-test
andpost-integration-test
- Have the reports from the integration-tests merged/presented with the unit test Surefire reports