2011-09-27 34 views
4

有誰知道的方式來實現測試DAO的流程如下:創建和清潔DB設置一次測試所有的DAO

  • 運行SQL腳本來創建公共DB設定(將數據插入到所有表)
  • 測試DAO1
  • 測試DAO2
  • ...
  • 清理DB數據步驟創建1

使用Spring,Hibernate,JUnit,Maven堆棧。

我明白,最好的做法是,我們爲每個測試DAO(@BeforeClass)和清理相同的數據所有測試完成後(@AfterClass)之後。

但是在我們的例子中,不同數據庫表之間的依賴關係太多了(客戶端的遺留數據庫:-(目前無法做到這一點)。用測試數據填充每個表需要將其他許多表中的數據作爲那麼,爲每個DAO單獨創建數據將是非常困難且耗時的,因此,我們確實需要創建DB測試數據只需要一次

我已經使用BaseDAO中的靜態塊創建了測試數據DAO Test Class) - 它顯然只運行一次,但是當所有DAO Test子類中的所有測試都完成時,如何進行相同的清理問題在基類中的@AfterClass拆卸方法每次都會在DAO Test類之後運行完成。

請指教。

回答

3

,一個很好的選擇是使用DBUnit。它允許您從數據庫中導出測試數據(或者只是將其寫入XML),以便導入您的測試。它有一個Maven plugin這將做你所需要的。

+0

不知道是否maven是要走的路。有時你需要在執行每個測試方法之前準備數據庫。是否有可能通過Maven實現這一點? –

+0

好的,你說得對。問題的細節是隻準備一次。 –

+1

是的。我們用JUnit'@ MethodRule'(或JUnit 4.9中的'@ TestRule')來完成它,它在每個測試方法之前設置數據庫,並在之後進行清理。無論哪種方式,OP已經在使用Maven,並且要求數據庫設置環繞整個測試階段,而不是測試方法,如問題所述。 – Daniel

0

我一般備份整個數據庫實例(其實我與甲骨文合作和小鬼/ EXP是偉大的工具)。 SQL Server和其他人有複製方法。準備好數據後,只需導出整個實例並在測試之前加載它。

一旦測試完成後,刪除DB和重建。 (反傾銷和加載整個DB與本機程序可以快於預期)

問候

PS:如果你可以,只是建立了一個克隆數據庫的虛擬機上,然後保存快照OV虛擬機(所以你可以稍後恢復它)。

1

在春季3:

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:schema.sql"/> 
    <jdbc:script location="classpath:test-data.sql"/> 
</jdbc:embedded-database> 

Documentation。要清理測試後的數據庫中,創建一個Spring bean,將只在測試過程中被拾起:如果您使用的Maven

@Service 
public class DbCleanup { 
    @Resource 
    private DataSource ds; 

    @PreDestroy 
    public cleanUpDb() { 
     //do your cleanup with DB 
    } 
} 
1

我採用如下方案。

(1)I有一個稱爲夾具

package com.obecto.fixtures; 

public interface Fixture { 

    void prepare(); 

} 

(2)I製備SQL夾具來填充空數據庫簡單的界面 - 這可以通過實體或通過執行這樣的SQL來完成:

package com.avaco2.fixtures; 

import java.util.logging.Logger; 

import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; 
import org.springframework.stereotype.Component; 
import org.springframework.test.jdbc.SimpleJdbcTestUtils; 

import com.obecto.fixtures.Fixture; 

@Component(value="logEventsSQLFixture") 
public class LogEventsSQLFixture implements Fixture { 
    private static String IMPORT_SQL = "import-LogEvents.sql"; 
    private static Logger LOG = Logger.getLogger(LogEventsSQLFixture.class.getName()); 

    @Autowired 
    private BasicDataSource dataSource; 

    @Override 
    public void prepare() { 
     SimpleJdbcTemplate jdbcTemplate = new SimpleJdbcTemplate(dataSource); 
     Resource sqlScript = new ClassPathResource(IMPORT_SQL); 
     try { 
      SimpleJdbcTestUtils.executeSqlScript(jdbcTemplate, sqlScript, true); 
     } catch (Exception e) { 
      LOG.severe("Cannot import " + IMPORT_SQL); 
     } 

    } 

} 

(3)注入你的燈具到測試類和prepare -them在@Before - 方法。

總是使用另一個數據庫進行測試,因此您可以安全地使用創建 - 刪除設置休眠。要重新加載各測試方法之前,你可以使用下面的註釋上下文 - @DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)

1

沒有人建議用每個測試@事務屬性註釋。如果數據庫引擎支持它,應該注意回滾狀態。有關詳細信息,請參見herestackoverflow link

0

您還可以使用數據庫模型工具,如Acolyte(https://github.com/cchantep/acolyte),在這種情況下,您不需要清理數據,確定哪些數據可用於哪些JDBC進行哪些測試,而無需更改基於JDBC的代碼想要測試。