2014-05-13 76 views
0

比方說,我們有下一個測試:如何在課後回滾事務(使用TestNg和Spring)?

@ContextConfiguration(classes = {MyDaoContext.class}) 
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests { 

@Autowired 
private MyDao dao; 

@Test 
public void insertDataTest() { 
    // insert data here and test something 
} 

@Test(dependsOnMethods = "insertDataTest") 
public void modifyPreviouslyInsertedDataTest() { 
    // get previously inserted data and test something 
} 
} 

二測將下降,因爲當我們已經完成了第一次測試插入的數據都沒有了。 在所有測試完成其工作後,是否有辦法回滾事務?

回答

3

刪除數據每個測試都在自己的事務中運行,並在最後進行回滾。您可以在第一次測試中加入@Rollback(false)來調整。

現在的問題是insertDataTest的交易已完成,因此您應該刪除手動創建的內容。要做到這一點,您擴展的類有幾種實用方法,如deleteFromTablesdeleteFromTableWhere

這應該是在@AfterClass什麼的理想情況下。

但這不是我會做的。我會將共享實用程序中由insertDataTest插入的數據分解出來。這樣,您可以在第二次測試中再次調用它並刪除dependsOnMethods。不建議使用這種依賴性,因爲您無法單獨運行該測試。

+0

有沒有辦法使用spring來爲我做這項工作? (deleteFromTables或deleteFromTableWhere) – nikopol86

+0

那麼你在調用這些方法時已經使用了Spring。你在做什麼後? –

+0

嗨,「將insertDataTest插入到共享實用程序中的數據分解出來」。請詳細解釋一下 – Tiina

2

嘗試以下操作(這將在JUnit的工作,我不知道TestBG)

@ContextConfiguration(classes = {MyDaoContext.class}) 
public class MyDaoTest extends AbstractTransactionalTestNGSpringContextTests { 

    @Autowired 
    private MyDao dao; 

    @Test 
    @Rollback(false) 
    public void insertDataTest() { 
     // insert data here and test something 
    } 

    @Test(dependsOnMethods = "insertDataTest") 
    public void modifyPreviouslyInsertedDataTest() { 
     // get previously inserted data and test something 
    } 
} 

當然,在這種情況下,你就必須手動從第一種方法

+0

感謝您的回覆。但是,如果我添加@Rollback(false),所有測試完成後,數據將保留在數據庫中。我只需要在測試過程中使用數據庫中的數據,並且需要在測試完成後回滾所有插入。 – nikopol86

+0

是的,你將不得不手動刪除數據 – geoand