2010-11-02 130 views
2

我正在爲我的DAO編寫一些測試,並且因爲很多測試使用了保存到我的數據庫的測試對象,我創建了一個setup()和teardown()方法(註釋@Before和@After)以避免多餘的代碼,但其中一個測試,實際上並不需要測試對象的一個​​測試,在DAO中調用一個包含調用getCurrentSession()的方法。這是一種使用ScrollableResults從批處理中獲取數據的方法,並且避免內存填滿每50行調用flush()和clear()的方法。這就產生了一個問題,因爲清()實際上消除了在從會話建立()創建的測試對象,所以當拆除()被調用我得到一個錯誤:@Before和@After排除

 
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [nl.ru.cmbi.pdbeter.core.model.domain.PDBEntry#395] 

有沒有一種辦法告訴JUnit不要在這個測試中使用setup()和teardown(),還是把所有不需要setup()和teardown()的測試放在新的測試類中更好?

回答

6

首先是的,在單獨的測試中隔離不需要@Before@After行爲的測試是非常有意義的。其次,你可能想看看Spring Framework's support for running unit tests within a database transaction,它會在每次測試結束時自動回滾,這樣你就不必擔心一些測試會影響外部資源的狀態,或者詢問關於在每個訂單中運行哪些測試的問題等。將其與內存數據庫(如HSQL)結合使用,您甚至不需要擔心運行的數據庫可能會運行,從而使您的構建更加便攜。

+0

感謝您的快速回答!然後,我將創建一個新的測試課程。而且我已經在使用spring的事務中運行測試;) – FinalArt2005 2010-11-02 13:50:28

2

JUnit會運行與@Before@After註釋每個測試,所以你需要將你的測試分爲兩個類的所有方法。

0

定義自己的BlockJUnit4ClassRunner:

public class WithoutBeforeAfter extends BlockJUnit4ClassRunner { 

    public WithoutBeforeAfter(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected Statement withBefores(FrameworkMethod method, Object target, Statement statement) { 
     if(method.getName().equals("[email protected]")){ 
      return statement; 
     }else{ 
      return super.withBefores(method, target, statement); 
     } 
    } 

    @Override 
    protected Statement withAfters(FrameworkMethod method, Object target, Statement statement) { 
     if(method.getName().equals("[email protected]")){ 
      return statement; 
     }else{ 
      return super.withAfters(method, target, statement); 
     } 
    } 
} 

然後在你的測試用例中使用它:

@RunWith(value=WithoutBeforeAfter.class) 

至少它可以使用JUnit 4.8。

相關問題