有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在创建以Hibernate作为数据访问层的SpringMVC应用程序。所有my实体都包含createdOnupdatedOn字段,这些字段包含实体创建/更新时的时间戳。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) 个答案

  1. # 1 楼答案

    如果您正在测试Hibernate侦听器,只需在断言之前手动调用^{}

    让Spring将SessionFactory注入到测试中,然后执行sessionFactory.getCurrentSession().flush();

    如果希望侦听器在刷新会话之前执行操作,则需要使用不同的事件(例如合并或持久化)