Spring @Transactional does not work in JUnit test?

29,317

Solution 1

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.

Solution 2

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.

Solution 3

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.

Share:
29,317
Nilesh
Author by

Nilesh

Tech Crazy

Updated on July 05, 2022

Comments

  • Nilesh
    Nilesh almost 2 years

    I am using Spring 3.2, Hibernate and JUnit 4.

    My Dao class is as follows:

    @Transactional public class SomeDaoImpl implements SomeDao {

    The update operations on this work if executed directly from web application. However, I am seeing that junit integration tests that exercise the update methods do not actually persist the changes. Is something rolling the transactions back when junit methods are executed?