dbunit mysql bug no_Unitils集成DBUnit、Spring-单元测试

Unitils集成DBUnit、Spring-单元测试

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

org.unitils

unitils-dbunit

3.4.2

org.unitils

unitils-io

3.4.2

org.unitils

unitils-database

3.4.2

org.unitils

unitils-spring

3.4.2

以上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&useUnicode=true&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,在上一篇博客中有讲到,代码如下

packagecom.candle.util;importorg.dbunit.database.DatabaseConfig;importorg.dbunit.ext.mysql.MySqlDataTypeFactory;importorg.dbunit.ext.mysql.MySqlMetadataHandler;importorg.unitils.dbunit.DbUnitModule;importorg.unitils.dbunit.util.DbUnitDatabaseConnection;public class MySqlDbUnitModule extendsDbUnitModule {

@OverridepublicDbUnitDatabaseConnection getDbUnitDatabaseConnection(finalString schemaName) {

DbUnitDatabaseConnection result=dbUnitDatabaseConnections

.get(schemaName);if (null !=result) {returnresult;

}

result= super.getDbUnitDatabaseConnection(schemaName);

result.getConfig().setProperty(

DatabaseConfig.PROPERTY_DATATYPE_FACTORY,newMySqlDataTypeFactory());

result.getConfig().setProperty(

DatabaseConfig.PROPERTY_METADATA_HANDLER,newMySqlMetadataHandler());returnresult;

}

}

加如上类之后,再去看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、测试代码

packagecom.candle.dao;import static org.junit.Assert.*;importorg.junit.Test;importorg.unitils.UnitilsJUnit4;importorg.unitils.database.annotations.Transactional;importorg.unitils.database.util.TransactionMode;importorg.unitils.dbunit.annotation.DataSet;importorg.unitils.dbunit.annotation.ExpectedDataSet;importorg.unitils.reflectionassert.ReflectionAssert;importorg.unitils.spring.annotation.SpringApplicationContext;importorg.unitils.spring.annotation.SpringBean;importcom.candle.model.LoginDO;

@SpringApplicationContext({"applicationContext-test.xml"})public class LoginDAOTest5 extendsUnitilsJUnit4{//Spring容器中加载Id为"userService"的Bean

@SpringBean("loginDAO")privateLoginDAO loginDAO ;

@Test

@ExpectedDataSet("/dataSetXml/login_expect.xml")public voidtestSaveLogin() {

LoginDO loginDo= newLoginDO();

loginDo.setId(2);

loginDo.setName("thomas");

loginDo.setPasswd("123qwe");

loginDAO.saveLogin(loginDo);

}

@Test

@DataSet("/dataSetXml/login.xml")//@Transactional(value=TransactionMode.ROLLBACK)

public voidtestFindById() {

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的配置,则可以生效~

此问题有待研究~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值