Java 冬眠+;JUnit多线程集成测试
我在JUnit中使用Hibernate和Spring进行集成。如果代码正确处理并发性,我将使用多次读写来测试代码。Hibernate的问题是我不能单独使用多线程来模拟它。Hibernate抱怨没有绑定到DAOs的活动Hibernate会话。所以,我所做的是在Hibernate的TransactionTemplate中的线程中执行DAOs的方法Java 冬眠+;JUnit多线程集成测试,java,spring,hibernate,junit,Java,Spring,Hibernate,Junit,我在JUnit中使用Hibernate和Spring进行集成。如果代码正确处理并发性,我将使用多次读写来测试代码。Hibernate的问题是我不能单独使用多线程来模拟它。Hibernate抱怨没有绑定到DAOs的活动Hibernate会话。所以,我所做的是在Hibernate的TransactionTemplate中的线程中执行DAOs的方法 Thread alpha = new Thread(new Runnable() { @Override
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)
,操作也无法在测试结束时回滚
谢谢True将以下内容添加到您的测试课程中:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration("classpath:application-context.xml")
@TransactionConfiguration(defaultRollback=true)
下面一行是您的application-context.xml
<tx:annotation-driven/>
您可以删除测试代码中的显式事务处理。是的,我在测试类中添加了所有这些。只有当您的测试是单线程时,这些选项才有效。默认情况下,defaultRollback=true。注解
@TransactionConfiguration
不够高,您找到解决方案了吗?