我使用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