zoukankan      html  css  js  c++  java
  • 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:workspaceunit-demosrc estjavacomcandledao #数据集加载策略 #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的配置,则可以生效~

      此问题有待研究~

      



  • 相关阅读:
    数据库系统概念PDF下载
    数据库系统基础教程PDF下载
    推荐系统技术、评估及高效算法PDF下载
    系统分析与设计方法PDF下载
    像计算机科学家一样思考pythonPDF下载
    学习bashPDF下载
    厚书读薄丨《Vim实用技巧》第一部分 模式
    Code Server 是什么?
    ubuntu磁盘分区
    Linux自学之旅-基础命令(umask默认权限)
  • 原文地址:https://www.cnblogs.com/candle806/p/3810061.html
Copyright © 2011-2022 走看看