Spring @Transactional does not work in JUnit test?

By reference, transactions are not persisted in test contexts in Spring. As mentioned, although unusual, if you still need to do so you can use @TransactionConfiguration and @Rollback to change the default behavior.


DAOs should not be transactional. How can a DAO know if it should participate in a larger transaction?

Services ought to own transactions in the typical Spring layered architecture.

It's typical to run your unit tests for databases in such a way that they do roll back. You don't want your tests to alter the database, unless you've set up a test database that you can drop and recreate at will.

The question ought to be: How do your tests, as written, commit the transaction? If you never commit, you'll never see the records.


From the "Testing" section of the docs, you can use the

 @Rollback(false) 

annotation if you don't want SpringJUnit4ClassRunner to roll back your transactions.