我在JUnit中使用Hibernate和Spring进行集成。我使用多次读写来测试我的代码是否正确处理并发性。Hibernate的问题是我不能单独使用多线程来模拟。Hibernate抱怨没有活动的Hibernate会话绑定到dao。因此,我所做的工作是在线程中执行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();
它工作。我的问题,有没有更好的方法来做到这一点,而不是使用TransactionTemplate(…)在一个Spring+Hibernate+Junit设置?
另外,我发现即使在测试用例的开始处包含了 @TransactionConfiguration(defaultRollback = true)
,该操作也不能在测试结束时回滚。
谢谢
true添加以下代码到您的测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)
和下面一行到application-context.xml
<tx:annotation-driven/>
您可以删除测试代码中的显式事务处理。