Spring JUnit测试中未调用java Hibernate侦听器
我正在创建以Hibernate作为数据访问层的SpringMVC应用程序。所有my实体都包含createdOn
和updatedOn
字段,这些字段包含实体创建/更新时的时间戳。createdOn
字段使用PreInsertEventListener
设置,updatedOn
字段使用PreUpdateEventListener
设置
当我运行我的应用程序时,它按预期工作,注册侦听器,当我保存实体时,调用适当的侦听器(使用调试器验证)。但是当我尝试对这种行为进行单元测试时,侦听器被注册,但从未被调用
我通过调试确定,当我在应用程序中保存一个实体时EntityInsertAction#preInsert
被调用,该应用程序通过注册的侦听器循环并调用它们。但当我运行单元测试时,这个方法从未被调用
下面是我的单元测试示例:
@ActiveProfiles("test")
@Transactional
@TransactionConfiguration
@ContextConfiguration(classes = {
BaseConfiguration.class,
DatabaseConfiguration.class
})
@RunWith(SpringJUnit4ClassRunner.class)
public class HibernateListenerTest {
@Autowired
private FooDao fooDao;
@Test
public void testPreUpdateListener() {
Foo foo = fooDao.merge(createFoo());
Assert.assertNotNull(foo.getCreatedOn());
Assert.assertNull(foo.getUpdatedOn());
foo.setBar("Bar");
foo = fooDao.merge(foo);
Assert.assertNotNull(foo.getUpdatedOn());
}
}
由于未调用侦听器,因此单元测试总是失败,出现以下异常:
org.hibernate.PropertyValueException: not-null property references a null or transient value
所以我的问题是:为什么在运行应用程序和运行单元测试之间这种行为有所不同,以及是否有办法修复代码,以便在单元测试中正确调用侦听器
提前感谢您的任何意见。如果需要其他代码/信息,请留下评论
# 1 楼答案
如果您正在测试Hibernate侦听器,只需在断言之前手动调用^{}
让Spring将
SessionFactory
注入到测试中,然后执行sessionFactory.getCurrentSession().flush();
如果希望侦听器在刷新会话之前执行操作,则需要使用不同的事件(例如合并或持久化)