2012-01-17 98 views
1

我有大約10個JUnit會自動執行。我想重新設置每個數據庫。我有這樣一段代碼:在運行JUnit測試之前重置mysql數據庫

//@Transactional 
public class TestMediaObjectService extends AbstractDataAccessTest{ 

//This method reset the database, emptying the tables 
    @Test 
    public void testCreateDataBase() throws Exception { 
     TestDatabaseCreation creation = new TestDatabaseCreation(); 
     creation.resetDatabase(); 
    } 

//This is one of the methods. 
    @Test 
    public void testStoreMediaObject() throws Exception { 
//...... 
} 

當我與我使用的方法testCreateDataBase和之後運行該測試(沒有那個方法)相同的腳本手動重置數據庫,自動創建的表。但是,如果我運行代碼,我在上面粘貼,未創建的表,所以我得到這個錯誤:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'one_table' doesn't exist

我怎麼能運行在測試運行的其他方法之前,在每一個方法是什麼?註釋@Transactional已被刪除,但錯誤仍然存​​在。

回答

3

通常您不需要手動重置數據庫,因爲JUNIT會在每次測試之前爲您完成此操作。使用這些註釋:

@TransactionConfiguration(defaultRollback = true) 
@Transactional 
@RunWith(SpringJUnit4ClassRunner.class) 

Junit將在運行後回滾測試中完成的所有事務。所有你需要的是一個現有的空數據庫。如果你使用hibernate來管理你的實體,你甚至不需要擁有這些表。

如果你想要做手工,使用@Before註釋在設置方法:

@Before 
public void init() { 
    createTables(); 
} 

這將在每次測試之前運行。

如果要爲一個班的所有測試設置數據庫表一次,請使用@BeforeClass。但通常這不是最佳實踐,因爲每個測試都應獨立於任何其他測試。

+0

此配置不會重置數據庫。它表示測試將在數據庫事務中執行,事務將不會被提交,而是回滾。一切都將發生在實體管理器緩存中或未提交數據庫事務。簡單的單元測試應該這樣工作。更復雜的集成測試不會。 – 2012-01-17 08:22:49

+0

我明白你的觀點,即使這個問題沒有具體說明數據是否真的需要承諾。但是:爲什麼你要在單元測試中實際向數據庫提交數據呢?我能想到的唯一原因是測試數據庫連接或事務環境,或者如果您有分佈式環境。對現有數據的集成測試不應該在單元測試中完成,我認爲該測試不會是獨立的。它應該自己設置所有必需的數據。 – Pete 2012-01-17 08:28:12

+0

謝謝,但數據庫不會重置這些註釋。我得到DuplicateObjectException。我在我的應用程序中進行了一些測試,並且我有一個針對該問題的數據庫。是不是在應用程序本身使用數據庫 – 2012-01-17 08:38:36