Hibernate + JUnit多线程集成测试

时间:2013-06-12 06:49:26

标签: java spring hibernate junit

我在JUnit中使用Hibernate与Spring一起进行集成。如果他们正确处理并发,我使用多次读写来测试我的代码。使用Hibernate的事情是我不能单独使用多个线程来模拟它。 Hibernate抱怨没有绑定到DAO的活动Hibernate会话。所以,我所做的就是在一个线程中的Hibernate的TransactionTemplate中执行DAO的方法,例如。

   Thread alpha = new Thread(new Runnable() {
            @Override
            public void run() {
                TransactionTemplate tt = new TransactionTemplate(tm);
                tt.execute(new TransactionCallbackWithoutResult() {
                    @Override
                    public void doInTransactionWithoutResult(TransactionStatus status) {
                        Address address =addrDao.findBy("John Doe");
                        address.setZipCode("12345");
                        addrDao.update(address);
                    }
                });

            }
        });

使用相同内容创建另一个线程测试版,并增加一个时间延迟。最后,启动两个线程,

    alpha.start();
    beta.start();

有效。我的问题是,除了在Spring + Hibernate + Junit设置中使用TransactionTemplate(...)之外,还有更好的方法吗?

此外,我发现即使我在此测试用例的开头包含 @TransactionConfiguration(defaultRollback = true) ,也无法在此测试结束时回滚该操作。

由于

1 个答案:

答案 0 :(得分:0)

true将以下内容添加到测试类中:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)

以及application-context.xml的以下行

<tx:annotation-driven/>

您可以删除测试代码中的显式事务处理。