2013-06-12 113 views
1

我在JUnit中使用Hibernate和Spring一起進行集成。如果他們正確處理併發,我使用多次讀取和寫入來測試我的代碼。 Hibernate的事情是我不能單獨使用多個線程來模擬。 Hibernate抱怨沒有綁定到DAO的活動Hibernate Session。所以,我所做的工作就是在Thread中的Hibernate的TransactionTemplate中執行DAO的方法,例如,Hibernate + JUnit多線程集成測試

Thread alpha = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       TransactionTemplate tt = new TransactionTemplate(tm); 
       tt.execute(new TransactionCallbackWithoutResult() { 
        @Override 
        public void doInTransactionWithoutResult(TransactionStatus status) { 
         Address address =addrDao.findBy("John Doe"); 
         address.setZipCode("12345"); 
         addrDao.update(address); 
        } 
       }); 

      } 
     }); 

用額外的時間延遲創建另一個線程,測試版,但內容相同。最後,啓動兩個線程,

alpha.start(); 
    beta.start(); 

它工作。我的問題是,除了在Spring + Hibernate + Junit安裝程序中使用TransactionTemplate(...),還有更好的方法嗎?

而且,我發現,行動不能,即使我已經包括@TransactionConfiguration(defaultRollback = true)在這個測試案例的開始本次測試結束回退。

感謝

+0

嗨,您是否設法找到解決方案? – FourtyTwo

回答

0

trueAdd下面給你測試類:

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
@ContextConfiguration("classpath:application-context.xml") 
@TransactionConfiguration(defaultRollback=true) 

和下面一行到你的應用程序的context.xml

<tx:annotation-driven/> 

可以刪除顯式事務處理中你的測試代碼。

+0

是的,我在測試課中添加了所有內容。只有當您的測試是單線程時,這些纔有效。 – thlim

+0

默認爲defaultRollback = true。 Annotation'@ TransactionConfiguration'就足夠了 – shevchyk