views:

27

answers:

1

Hi!

I am writing integration tests and in one test method I'd like to write some data to DB and then read it.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
@TransactionConfiguration()
@Transactional
public class SimpleIntegrationTest {

    @Resource
    private DummyDAO dummyDAO;

    /**
     * Tries to store {@link com.example.server.entity.DummyEntity}.
     */
    @Test
    public void testPersistTestEntity() {
        int countBefore = dummyDAO.findAll().size();
        DummyEntity dummyEntity = new DummyEntity();
        dummyDAO.makePersistent(dummyEntity);

        //HERE SHOULD COME SESSION.FLUSH()

        int countAfter = dummyDAO.findAll().size();

        assertEquals(countBefore + 1, countAfter);
    }
}

As you can see between storing and reading data, the session should be flushed because the default FushMode is AUTO thus no data can be actually stored in DB.

Question: Can I some how set FlushMode to ALWAYS in session factory or somewhere else to avoid repeating session.flush() call?

All DB calls in DAO goes with HibernateTemplate instance.

Thanks in advance.

A: 

This should be sufficient:

@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SimpleIntegrationTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired(required = true)
    private DummyDAO dummyDAO;

    @Test
    public void testPersistTestEntity() {
        assertEquals(0, dummyDAO.findAll().size());
        dummyDAO.makePersistent(new DummyEntity());
        assertEquals(1, dummyDAO.findAll().size());
    }
}

From applicationContext.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
</bean>

View the source of TransactionalTestExecutionListener if you have questions about how transactions work in this scenario.

You can also use AOP (aspect oriented programming) to proxy transactions.

hisdrewness
Sorry, sufficient for what? I don't really get how this can solve the problem of having hibernate session be flushed after storing the object.
glaz666
While you've annotated to be transactional, no transactions are actually being handled. Take a look at the TransactionalTestExecutionListener class. There's a beforeTestMethod that opens transactions, and an afterTestMethod that closes/rollsback.
hisdrewness