我想使用弹簧测试框架测试休眠会话的 save() 方法。@Test 方法是:
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
我想将用户刷新到数据库中。我希望我的用户在这种方法之后进入数据库
getGenericDao().currentSession().save(expected);
然后我想使用 spring 数据框架进入数据库并通过下一行获取这个保存的用户:
User actual = getUser(generatedId);
我尝试使用休眠刷新方法,例如:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
它不会将我的用户刷新到数据库中!但是,如果我不使用 @Transactional spring 注释并将我的用户保存在程序化 spring 事务中,我将实现我想要的。不幸的是,保存到数据库中的用户没有回滚,因为没有弹簧@Transactional。因此,我的测试方法改变了后续测试方法的数据库和行为。
所以我需要将我的用户刷新到测试方法内的数据库中(而不是最后),并在测试方法结束时回滚对数据库的所有更改。
更新建议准备方法如下:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
并且在 testSave 中调用 doSave 什么也不做。执行此方法后,我在 db 中仍然没有用户。我设置断点并从命令行检查我的数据库。
更新非常感谢您的回复。问题是方法 flush() 没有将我的用户放入数据库。我尝试了 Isolation.READ_UNCOMMITTED 并且它没有将我的用户放入数据库。我可以实现我想要的,但前提是我关闭 @Test 方法上的 spring 事务并保存编程事务。但是,@Test 方法不会回滚,将保存的用户留给后续的@Test 方法。这里@Test 方法保存用户不像@Test 方法删除用户那样危险,因为它没有回滚。所以必须有对@Test 方法的spring 事务支持,我无论如何都不能将我的用户(或删除)放入数据库中。实际上,只有在 @Test 方法结束并且 @Test 方法的事务被提交后,用户才被放入(或删除)到数据库中。所以我想将我的用户保存到@Test方法中间的db中,并在@Test方法结束时回滚它
谢谢!