我在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)
,也无法在此测试结束时回滚该操作。
由于
答案 0 :(得分:0)
true将以下内容添加到测试类中:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)
以及application-context.xml的以下行
<tx:annotation-driven/>
您可以删除测试代码中的显式事务处理。