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

  此问题有待研究~

Unitils集成DBUnit、Spring-单元测试(转)的更多相关文章

  1. Unitils集成DBUnit、Spring-单元测试

    Unitils集成DBUnit.Spring-单元测试 1.maven-pom文件中引入相关jar包 <!-- Unitils -dbunit.Spring --> <depende ...

  2. Unitils集成DBUnit的问题-解决方案

    Unitils在集成DBunit时,如果数据库是mysql时,就会出现一些如下: org.unitils.core.UnitilsException: Error inserting test dat ...

  3. 关于unitils联合dbunit的测试

    unitils据说测试的能力很强大,可测试dao,service,web层,其实对数据库的测试我更关心,看到有人展示了测试的方法,数据直接写在xls表中,很直观,然后就依照他们的方法进行试验,花费的时 ...

  4. spring集成Junit做单元测试及常见异常解决办法

    spring-test依赖包 <!--Spring-test --> <!-- https://mvnrepository.com/artifact/org.springframew ...

  5. 一键式Spring集成工具 Spring Boot

    最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的 比如拦截器:@As ...

  6. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  7. Spring单元测试

    1.基于AbstractDependencyInjectionSpringContextTests Spring的单元测试可以使用AbstractDependencyInjectionSpringCo ...

  8. MyBatis集成到Spring时配置MapperScannerConfigurer出错

    问题描述 在web项目中同时集成了spring mvc和mybatis. 将jdbc配置参数独立在外部配置文件中,然后通过<context:property-placeholder>引入. ...

  9. MyEclipse的JPA实现集成EasyJF+Spring

    该视频是演示MyEclipse的JPA实现集成EasyJF+Spring的示例视频.演示项目很小,仅实现基本的查询功能. 演示过程中难免有误,请各位朋友热心指导! gh发给梵蒂冈地方fgh

随机推荐

  1. 《C程序设计语言》笔记(二)

    四:函数与程序结构 1:函数之间的通信可以通过参数.函数返回值以及外部变量进行. 2:如果函数定义中省略了返回值类型,则默认为int类型.如果没有函数原型,则函数将在第一次出现的表达式中被隐式声明,比 ...

  2. Spark in action on Kubernetes - 存储篇(一)

    前言 在上篇文章中,我们分析了Spark Operator内部的机制,今天我们会讨论一个在大数据领域中最重要的话题 - 存储.大数据已经无声无息的融入了每个人的生活中.大到旅游买房,小到外卖打车,都可 ...

  3. margin负边距的使用(超简单)

    写在开头: 在css的世界中,一切都是框,所有的框都处于流动的状态 margin负边距可以使文档流发生偏移   在没有设置margin-bottom的时候,parent的高度会跟随child的内部元素 ...

  4. 最短路-SPAF模板

    以hdu1874畅通工程续为例 #include<iostream> #include<cstring> #include<cstdio> #include< ...

  5. HDU 5584 LCM Walk【搜索】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 分析: 这题比赛的时候卡了很久,一直在用数论的方法解决. 其实从终点往前推就可以发现, ...

  6. 什么是Hessian协议呢?

    什么是Hessian协议呢? 目前,Web服务技术是解决异构平台系统的集成及互操作问题的主流技术. 它所基于的XML已经是Internet上交换数据的实际标准,基于通用的进程间通信协议和网络传输协议屏 ...

  7. 中断源记录 INT0 INT1

    中断源记录 INT0 INT1 用到一个单片机 使用的 P3.1 P3.3 作为唤醒口,后来发一 P3.1 和 P3.3 使用的同一个中断 INT1,这个尴尬了,只能两选 一. 查看规格书,还好 P3 ...

  8. selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面(转)

    selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面 博客分类: Selenium-webdriver 元素拖放drag and drop  Q群里 ...

  9. poj 1039 Pipe (Geometry)

    1039 -- Pipe 理解错题意一个晚上._(:з」∠)_ 题意很容易看懂,就是要求你求出从外面射进一根管子的射线,最远可以射到哪里. 正解的做法是,选择上点和下点各一个,然后对于每个折点位置竖直 ...

  10. 分布式TensorFlow集群local server使用详解

    通过local server理解分布式TensorFlow集群的应用与实现. ​​简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...