我使用Hibernate作为数据访问层创建Spring MVC应用程序。我的所有实体都包含createdOn
和updatedOn
字段,其中包含实体创建/更新时的时间戳。 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
所以我的问题是:为什么运行应用程序和运行单元测试之间的这种行为不同,以及是否有方法修复代码,以便在单元测试中正确调用监听器?
在此先感谢您的任何意见。如果需要额外的代码/信息,请留下评论。
你调试了你的测试用例,看看EntityInsertAction#preInsert是否被调用?如果是,那么听众是否已注册?如果是这样,代码循环并调用它们? – 2014-12-08 06:31:35