SPring DBUnit 提供了spring測試框架和流行的DBunit項目的集成。經過簡單的註解,它能讓你設置和銷燬數據庫表,同時在測試完成時,檢查符合預期的表的內容。 java
項目能夠配置運行DBUnit測試經過使用Spring TestExecutionListener 或者使用一個JUnit @Rule.使用JUnit@Rule能夠更容易配置可是隻有在你使用JUnit4.7+纔有效。 git
注意:本部分配置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()); } }參考上面的詳細信息用來配置一個測試類使用加載器。