2014-12-07 70 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)。

相關問題