1

我在 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);
                    }
                });

            }
        });

创建另一个线程,beta,具有相同的内容,但有额外的时间延迟。最后,启动两个线程,

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

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

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

谢谢

4

1 回答 1

0

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

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

以及 application-context.xml 的以下行

<tx:annotation-driven/>

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

于 2013-06-12T06:55:01.213 回答