Unitils集成DBUnit、Spring-單元測試


 

  Unitils集成DBUnit、Spring-單元測試

  1、maven-pom文件中引入相關jar包  

<!-- Unitils -dbunit、Spring -->
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-dbunit</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-io</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-database</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-spring</artifactId>
            <version>3.4.2</version>
        </dependency>

  以上Unitils集成dbunit、Spring所必須jar包,工程文件是通過maven構建的,所以都是maven的目錄結構。

  2、引入unitils的配置文件unitils.properties,這個配置文件可以用unitils-core的jar包中copy出來,然后進行自定義配置,如下:

#啟用unitils所需模塊
unitils.modules=database,dbunit,spring

#自定義擴展模塊,詳見實例源碼
#unitils.module.dbunit.className=org.unitils.dbunit.DbUnitModule
unitils.module.dbunit.className=com.candle.util.MySqlDbUnitModule

#配置數據庫連接
database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8
database.userName=root
database.password=123qwe
#配置為數據庫名稱
database.schemaNames=test
#配置數據庫方言
database.dialect=mysql

#配置數據庫維護策略.請注意下面這段描述
# If set to true, the DBMaintainer will be used to update the unit test database schema. This is done once for each
# test run, when creating the DataSource that provides access to the unit test database. updateDataBaseSchema.enabled=false #配置數據庫表創建策略,是否自動建表以及建表sql腳本存放目錄 #dbMaintainer.autoCreateExecutedScriptsTable=false #dbMaintainer.script.locations=D:\workspace\unit-demo\src\test\java\com\candle\dao #數據集加載策略 #CleanInsertLoadStrategy:先刪除dateSet中有關表的數據,然后再插入數據 #InsertLoadStrategy:只插入數據 #RefreshLoadStrategy:有同樣key的數據更新,沒有的插入 #UpdateLoadStrategy:有同樣key的數據更新,沒有的不做任何操作 DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy #配置數據集工廠 DbUnitModule.DataSet.factory.default=org.unitils.dbunit.datasetfactory.impl.MultiSchemaXmlDataSetFactory DbUnitModule.ExpectedDataSet.factory.default=org.unitils.dbunit.datasetfactory.impl.MultiSchemaXmlDataSetFactory #配置事務策略 commit、rollback 和disabled;或者在代碼的方法上標記@Transactional(value=TransactionMode.ROLLBACK) #commit 是單元測試方法過后提交事務 #rollback 是回滾事務 #disabled 是沒有事務,默認情況下,事務管理是disabled DatabaseModule.Transactional.value.default=disabled #配置數據集結構模式XSD生成路徑,可以自定義目錄,但不能為空 dataSetStructureGenerator.xsd.dirName=/ dbMaintainer.generateDataSetStructure.enabled=true

  自定義配置文件有兩個,分別是unitils.properties和unitils-local.properties,但通常我們只需要配置unitils.properties即可,這個配置文件默認是放在工程的根目錄下,我這里的測試

根目錄是/src/test/resources/下。因為unitils默認是這樣去讀取配置文件的,所以不建議移動到其他目目錄,不然可能需要更改讀取配置文件的代碼了。

  3、寫一個mysql數據庫配置的類,用於解決dbunit中存在的bug,在上一篇博客中有講到,代碼如下  

package com.candle.util;

import org.dbunit.database.DatabaseConfig;
import org.dbunit.ext.mysql.MySqlDataTypeFactory;
import org.dbunit.ext.mysql.MySqlMetadataHandler;
import org.unitils.dbunit.DbUnitModule;
import org.unitils.dbunit.util.DbUnitDatabaseConnection;

public class MySqlDbUnitModule extends DbUnitModule {

    @Override
    public DbUnitDatabaseConnection getDbUnitDatabaseConnection(
            final String schemaName) {
        DbUnitDatabaseConnection result = dbUnitDatabaseConnections
                .get(schemaName);
        if (null != result) {
            return result;
        }
        result = super.getDbUnitDatabaseConnection(schemaName);
        result.getConfig().setProperty(
                DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                new MySqlDataTypeFactory());
        result.getConfig().setProperty(
                DatabaseConfig.PROPERTY_METADATA_HANDLER,
                new MySqlMetadataHandler());
        return result;
    }
}

  加如上類之后,再去看unitils.properties中  

#自定義擴展模塊,詳見實例源碼
#unitils.module.dbunit.className=org.unitils.dbunit.DbUnitModule
unitils.module.dbunit.className=com.candle.util.MySqlDbUnitModule          
如上就制定到自定義的類
com.candle.util.MySqlDbUnitModule,解決dbunit中可能存在的bug

4、准備測試數據
@DataSet和@ExpectedDataSet
這里都用xml來存放數據,如果要用excel,需要重寫excel獲取數據的相關代碼
xml存放路徑如下:src/test/resources/dataSetXml/,目錄下包括@DataSet數據(login.xml)和@ExpectedDataSet數據login_expect.xml

5、測試代碼
package com.candle.dao;

import static org.junit.Assert.*;

import org.junit.Test;
import org.unitils.UnitilsJUnit4;
import org.unitils.database.annotations.Transactional;
import org.unitils.database.util.TransactionMode;
import org.unitils.dbunit.annotation.DataSet;
import org.unitils.dbunit.annotation.ExpectedDataSet;
import org.unitils.reflectionassert.ReflectionAssert;
import org.unitils.spring.annotation.SpringApplicationContext;
import org.unitils.spring.annotation.SpringBean;

import com.candle.model.LoginDO;

@SpringApplicationContext({"applicationContext-test.xml"})
public class LoginDAOTest5 extends UnitilsJUnit4{
    
    //Spring容器中加載Id為"userService"的Bean
    @SpringBean("loginDAO")
    private LoginDAO loginDAO ;

    
    @Test
    @ExpectedDataSet("/dataSetXml/login_expect.xml")
    public void testSaveLogin() {
        LoginDO loginDo = new LoginDO();
        loginDo.setId(2);
        loginDo.setName("thomas");
        loginDo.setPasswd("123qwe");
        loginDAO.saveLogin(loginDo);
    }

    
    @Test
    @DataSet("/dataSetXml/login.xml")
    //@Transactional(value=TransactionMode.ROLLBACK)
    public void testFindById() {
        LoginDO loginDo = loginDAO.findById(1) ;
        ReflectionAssert.assertPropertyLenientEquals("name","candle",loginDo) ;
        assertNotNull("空置", loginDo);
        assertEquals("candle",loginDo.getName()) ;
    }
    
}

  其中,關於unitils集成spring,就是通過集成UnitilsJUnit4類引入spring的配置文件,即可完成Spring的bean之類的重用~

  6、回滾問題

  通過以上配置,包括事務配置,通過測試發現,unitils的事務是集成自Spring的,所以如果當測試類中集成了Spring的applicationContext配置文件,則unitils中的事務配置無效,這里測試過回滾事務,

  DatabaseModule.Transactional.value.default=rollback,在測試中引用Spring的配置時,此回滾無效,如果不引用Spring的配置,則可以生效~

  此問題有待研究~

  



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM