開源項目文檔翻譯###Spring Test DBUnit###

http://springtestdbunit.github.com/spring-test-dbunit/

簡介:

SPring DBUnit 提供了spring測試框架和流行的DBunit項目的集成。經過簡單的註解,它能讓你設置和銷燬數據庫表,同時在測試完成時,檢查符合預期的表的內容。 java

項目能夠配置運行DBUnit測試經過使用Spring TestExecutionListener 或者使用一個JUnit @Rule.使用JUnit@Rule能夠更容易配置可是隻有在你使用JUnit4.7+纔有效。 git

使用Spring TestExecutionListener的配置

注意:本部分配置DBUnit測試,運行時使用Spring TestExecutionListener。若是你想使用JUnit @Rule配置DBUnit,看下一節。 github

爲了讓Sring處理DBUnit註解,你必須首先配置你的測試去使用DBUnitTestExecution類。你須要使用Spring @TestExecutionListeners 註解。通常來講,除了DBUnitTestExecutionListener,你同時須要包括標準Spring 監聽器。下面是一個典型的JUnit4測試的註解。 spring

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        DbUnitTestExecutionListener.class })
查看Spring javaDocs中關於標準監聽器的介紹獲取詳細信息。

爲了鏈接數據庫,Spring DBUnit 須要一個bean 被註冊到你的測試XML文件中。默認一個bean命名或者能夠被使用(若是你須要其餘的名字,查看高級配置小節)。bean 能夠引用一個IDatabaseConnection或者更加典型的一個Java數據源。下面是一個典型的配置,鏈接超音速內存數據庫。 數據庫

當你配置了DbUnitTestExcutionListener,同時提供了鏈接數據庫的bean,你就能夠使用DBUnit註解了。 框架

使用JUnit @Rule配置 測試

注意:JUnit @Rule配置如今不能和Spring3.1工做,除非問題解決了,不然請使用TestExecutionListener。 spa

本小節配置DBUnit 測試運行在JUnit4.7+@Rule。查看上面若是你但願配置DBUnit測試使用Spring TestExecutionListener. code

爲了讓JUnit處理DBUnit註解,你必須配置你的測試使用DbUnitRule @Rule。爲此你須要使用Junit@Rule註解,結合DbUnitRule類。 xml

@Rule
public DbUnitRule dbUnit = new DbUnitRule();
你同時也須要確保你的測試類提供了獲取數據源或者IDtabaseConnection的方法。你能夠使用setDataSource或者setDatabaseConnection方法在規則上,或者更加通用的,注入一個數據源到一個測試類的私有的字段中。
@Autowired
private DataSource dataSource;
一旦你的規則定義好了你能夠使用DBUnit註解了。

設置和銷燬

注意:在任何註解能夠使用以前,你須要完成上面的配置小結步驟。沒有合適的配置,DBUnit註解將被忽略。

@DatabaseSetup 和@DatabaseTearDown 註解用來在測試執行以前配置數據庫表,在測試執行完成後重置它們。

設置

@DatabaseSetup註解暗示了數據庫表應該在方法運行以前設置。註解能夠在單個測試方法或者整個類上起做用。

看成用到類的級別上時,設置在測試的每一個方法上發生。註解的值引用了一個文件包含了能夠重置數據庫表的數據集。

典型的是一個標準的DBUnit XML文件,儘管它也能夠加載自定義類型(看下面)。

下面是一個典型的設置註解。在本例中,一個和測試文件相同的包下面的名稱爲sampleData.xml的文件被引用了。

@DatabaseSetup("sampleData.xml")
同時也能夠引用特定位置的資源,例如:
@DatabaseSetup("/META-INF/dbtest/sampleData.xml")
默認狀況下設置將執行一個操做。這意味着從XML數據集中引用的表的全部的數據在被插入新的行以前將被刪除。 經過使用類型屬性,標準的DBUnit操做將被支持。看下面的JavaDocs看查看詳細。

銷燬

@DatabaseTearDown註解能夠用來重置數據庫表當測試完成時。和@DatabaseSetup同樣的是,這個註解能夠在方法或者類層面上起效。當使用@DatabaseTearDown時,使用和@DatabaseSetup相同的方式使用值和類別屬性。

指望的結果

@ExpectedDatabase註解能夠用來在測試完成時,檢驗數據庫內容。當一個測試執行了一個插入,更新或者刪除操做,你將典型的使用這個註解。你能夠將這個註解用到一個單一的測試方法或者類中。當用在類級別上時,每一個方法執行後都會調用檢驗程序。

@ExpectedDatabase 註解須要一個value屬性,這個屬性引用數據集文件用來檢驗結果。下面是一個典型的例子。

@ExpectedDatabase("expectedData.xml")
@ExpectedDatabase註解支持兩種不一樣的模式。DatabaseAssertionMode.DEFAULT做爲一個標準的DbUnit測試運行,執行一個完整的指望數據集和實際數據集的比對。DatabaseAssertionMode.NON_STRICT將忽略沒有在指望數據集中出現,可是在實際數據集中出現的 表和列名。當集成測試執行在實際數據庫包含不少有不少列的表中, 這將十分有用。咱們不須要定義全部的這些,只須要咱們感興趣的表和列。

注意:若是你在測試中使用這個註解的同時還使用了@Transactional,你須要一個可選的配置。參見下面的小節。

事務

若是你配置DBUnit測試,使用了DbUnitTestExecutionListener以及使用了TransactionalTestExcecutionListener,你可能會經歷事務在你的數據設置以前沒有啓動的問題,或者在指望的數據集校驗以前就回滾的問題。爲了讓DBUnit支持@Transactional 測試,你須要使用TransactionDbUnitTestExecutionListener類。

注意:TransactionDbUnitExecutionListener提供了DBUnit和Transactional支持。當使用TransactionDbUnitTestExecutionListener時,你必須禁止使用TransactionalTestExecutionListener或者DbUnitTestExceutionListener類。

下面是一個典型的JUnit4測試類的註解:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@Transactional
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class,
        TransactionalDbUnitTestExecutionListener.class })
事務在@DatabaseSetup以前被調用,在@DatabaseTearDown 和@ExpectedDatabase以後被結束。

DbUnitTestExecutionListener的高級配置

注意:這個小結僅僅在你使用DbUnitTestExecutionListener時起效。若是你使用了Junit@Rule,參看下一小結。

若是你須要爲DBUnit配置高級選項,@DbUnitConfiguration註解能夠被使用。

databaseConnection屬性容許你精肯定位一個包含數據鏈接的Spring Context中的bean。當沒有定義名字時也能夠使用。這個bean必須實現IDatabaseConnection或者一個DataSource.

DbUnitRule的高級配置

注意:本小節僅僅在你使用DBUnitRule JUnit @Rule時起效。查看下面的部分若是你使用的時DbUnitTestExecutionListener;

DBUnitRule JUnit rule 將查看你的測試類中的私有的字段,用來配置本身。若是你的測試包括了一個DataSource字段或者一個IDataBaseConnection字段,這個將被使用來獲取一個數據庫鏈接。你也能夠包括一個DataSetLoader字段若是你但願可以使用一個自定義加載器當讀取數據集的時候(看下面)。

若是你須要更多的細粒度的控制,你也能夠調用rule上的setter方法。

自定義IDatabaseConnections

在一些場合下你可能須要建立一個IDatabaseConnection利用一個特定的DBUnit配置。不巧的是,標準DBUnit DatabaseConfig類不能被Sprign容易的使用。爲了克服這個缺陷,DatabaseConfigBean提供了一個可選的方法用來配置一個鏈接。提供標準的getter/setter提供給全部的配置選項。DatabaseDataSourceConnectionFactoryBean 接收一個配置屬性,應該用來構建最終的鏈接。下面是一個典型的例子:

<bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean">
    <property name="skipOracleRecyclebinTables" value="true"/>
</bean>

<bean id="dbUnitDatabaseConnection" class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
    <property name="databaseConfig" ref="dbUnitDatabaseConfig"/>
</bean>
注意:在最多的場合下,username和password屬性必須不被DataabaseDataSourceConnectionFactoryBean設置.這些屬性引發DBUnit啓動一個新的事物,將致使一個不能預料的行爲。

寫一個數據集加載器

默認狀況下,DBUnit數據集經過普通的XML文件加載。若是你須要從其餘數據源中加載數據,你想要寫你本身的數據集加載器,配置你的測試來使用它。自定義加載器必須實現DataSetLoader接口,提供一個loadDataSet方法的實現。AbstractDataSetLoader對於大多數加載器而言,提供了一個方便的基類,也能夠使用。

下面是一個從CSV文件中讀取數據的加載器的例子。

public class CsvDataSetLoader extends AbstractDataSetLoader {
    protected IDataSet createDataSet(Resource resource) throws Exception {
        return new CsvURLDataSet(resource.getURL());
    }
}
參考上面的詳細信息用來配置一個測試類使用加載器。
相關文章
相關標籤/搜索