【发布时间】:2012-08-27 10:55:12
【问题描述】:
我正在使用 Spring 3.1.2 和 Hibernate 4。
我有一个带有 @Repository 注释的 DAO 实现类 MyDaoImpl,以便启用异常翻译。我有一个服务类MyService 用@Transactional 注释如下:
public class MyService implements IMyService {
private MyDao myDao;
@Autowired
public void setMyDao(MyDao dao) {
this.myDao = dao;
}
@Override
@Transactional
public void createA(String name)
{
A newA = new A(name);
this.myDao.saveA(newA);
}
}
我写了一个单元测试类MyServiceTest如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:beans.xml" })
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class MyServiceTest implements IMyServiceTest {
private IMyService myService;
private SessionFactory sessionFactory;
@Autowired
public void setMyService(IMyService myService)
{
this.myService = myService;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
@Test
@Override
public void testCreateA()
{
//Assume that there is already a row of table A with the name "A1"
//so I expect to get a Spring DataAccessException (or subtypes)
//when the session is flushed
this.myService.createA("A1");
this.sessionFactory.getCurrentSession().flush();
//asserts
}
}
当我运行测试时,我得到一个 Hibernate 特定异常ConstraintViolationException。我在论坛上发现这是因为翻译系统发生在事务之外,所以在这种情况下testCreateA()返回之后。我不知道这是否是真正的原因,但如果是,则意味着我无法测试翻译是否适用于我的 DAO。一种解决方案是从我的单元测试中删除 @Transactional 注释,但我不会从回滚功能中受益。
你有什么建议?
编辑:我已将在我的上下文中声明的 SessionFactory 添加到测试类中,以便我可以访问当前会话以进行刷新。
一些额外的解释:在这种情况下,当会话被刷新时(在事务内部),我得到了异常。我刷新会话以避免误报,正如文档中所解释的那样。此外,由于默认传播是必需的,testCreateA() 事务也用于对createA() 的调用,因此在testCreateA() 返回之前(通常)不会刷新更改。
【问题讨论】: