2011-03-15 146 views
0

我使用的是Spring junit runner,它的事務功能可以在每次測試之前和之後啓動和回滾事務。春季,交易和單元測試 - 如何在課堂級別設置交易

但是,我有一個測試類,有一些沉重的數據庫初始化,我希望每個測試(方法)在事務範圍內運行,即在測試開始時啓動一個事務並在類中的所有測試之後回滾完成。

回答

4

您是否意識到在單個事務中使用類中的所有測試方法會造成很大的麻煩?基本上,你不能再依靠一個乾淨的數據庫,因爲其他測試方法會一路修改它。而且由於測試方法的順序沒有指定,所以你也不能依賴它(所以你永遠不會知道數據庫究竟保存了什麼)。本質上,你放棄了所有的測試事務支持,唯一的保證就是在運行整個測試用例之後,數據庫將保持乾淨(所以其他測試用例不會受到影響)。

抱怨你的結尾。我不認爲Spring支持這種開箱即用的行爲(部分原因在於上面強調的原因)。但是,如果您仔細查看TransactionalTestExecutionListener,它將負責Spring-powered測試中的事務性支持。

@Override 
public void beforeTestMethod(TestContext testContext) throws Exception { 
    //... 
    startNewTransaction(testContext, txContext); 
} 

和:

@Override 
public void afterTestMethod(TestContext testContext) throws Exception { 
    //... 
    endTransaction(testContext, txContext); 
    //... 
} 

現在看起來更近,也有未實現beforeTestClassafterTestClass ...你會發現詳細說明了如何把這個一切在春季參考文檔9.3.5章。提示:寫下你自己的聽衆,並用它代替TransactionalTestExecutionListener