繁体   English   中英

Spring JUnit测试中未调用Hibernate侦听器

[英]Hibernate listeners are not getting invoked in Spring JUnit test

我正在使用Hibernate作为数据访问层创建Spring MVC应用程序。 我所有的实体都包含createdOnupdatedOn字段,其中包含创建/更新实体时的时间戳。 createdOn字段是使用设置PreInsertEventListenerupdatedOn场使用设置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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM