[英]Hibernate listeners are not getting invoked in Spring JUnit test
我正在使用Hibernate作为数据访问层创建Spring MVC应用程序。 我所有的实体都包含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
所以我的问题是:为什么在运行应用程序和运行单元测试之间,此行为有何不同?是否有一种方法可以修复代码,以便在单元测试中正确调用侦听器?
预先感谢您的任何投入。 如果需要其他代码/信息,请发表评论。
如果要测试Hibernate侦听器,只需在声明前手动调用Session#flush
。
只需让Spring将SessionFactory
注入到您的测试中并执行sessionFactory.getCurrentSession().flush();
。
如果您希望您的听众在刷新会话之前采取行动,则需要使用其他事件(例如MERGE或PERSIST)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.