2014-12-07 59 views
1

我使用Hibernate作为数据访问层创建Spring MVC应用程序。我的所有实体都包含createdOnupdatedOn字段,其​​中包含实体创建/更新时的时间戳。 createdOn字段使用PreInsertEventListener设置,而updatedOn字段使用PreUpdateEventListener设置。在Spring JUnit测试中没有调用Hibernate侦听器

当我运行我的应用程序,它工作正常,听众注册,当我保存一个实体,适当的侦听器调用(使用已验证调试器)。但是,当我尝试单元测试这种行为时,监听器已注册,但从未调用过。

我决定使用调试,当我保存一个实体在我的应用程序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

所以我的问题是:为什么运行应用程序和运行单元测试之间的这种行为不同,以及是否有方法修复代码,以便在单元测试中正确调用监听器?

在此先感谢您的任何意见。如果需要额外的代码/信息,请留下评论。

+0

你调试了你的测试用例,看看EntityInsertAction#preInsert是否被调用?如果是,那么听众是否已注册?如果是这样,代码循环并调用它们? – 2014-12-08 06:31:35

回答

3

如果您正在测试Hibernate的听众,只是你的说法之前手动调用Session#flush

就让春天注入SessionFactory到您的测试,并做sessionFactory.getCurrentSession().flush();

如果你想被刷新会话之前你的听众采取行动,那么你就需要使用不同的事件(例如合并或PERSIST)。

相关问题