使用DBUnit测试SpringDao

环境是这样的:

一个DAO接口 ,一个DAO的缺省实现类,这个实现了DAO接口的所有方法,并使用了泛型,所以其他的DAO实现类都省下了,不用写了.因为所有的操作都在这个缺省实现类里面完成了.只需要在Spring 配置文件中配置一下就可以了。因为使用Hibernate,所以表之间的关系还是要测试的。测试也就离不开Spring环境了。还好Spring提供了好多测试类可以扩展,我使用的是AbstractTransactionalDataSourceSpringContextTests,据说它可以保持数据的清洁,操作完之后就回滚。跟据我的测试在没有加flush()时候它好象根本就没有插入到数据库中,在加入flush()之后数据还是保留在数据库中,没有回滚(删除)掉。测试的结果:

没加入flush() :

[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
保存成功 :001
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution

按照这个提示应该是成功了。可是缺了插入和删除的语句(因为我的Hibernate是showSql的),感觉并没有真的向数据库里写入数据。感觉不放心!!!

加入flush() :
2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
Hibernate: insert into Department (Manager, Name, Parent, Tel, Id) values (?, ?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试部门[01] success :01
Hibernate: insert into Users (Departmentid, Name, Password, Id) values (?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 测试[ 001 ] success :001
保存成功 :001
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution

这回出现在插入数据的语句了。但是操作完的数据还在数据库里呆着呢!!!

为了保险起见,还要自己来清理垃圾吧!所以引入DBUnit

在原有的测试之前通过DBUnit准备数据,在测试之后清量数据。真是任劳任怨!

看一下代码:这个是Dao的测试基本类,其他的测试都继续这个就可以了。

package test.support;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

/**
* Dao 测试基础类
*
* @author libo <br>
* @version 1.0 2007-9-6<br>
*/
public abstract class BaseDaoTest extends
AbstractTransactionalDataSourceSpringContextTests {

private ApplicationContext ctx;

private BasicDataSource dataSource;

private IDatabaseConnection connection;

public void execute(String path, DatabaseOperation oper) {
IDataSet dataset;
try {
dataset = new FlatXmlDataSet(new FileInputStream(path));
if (connection == null) {
if (dataSource == null)
dataSource = (BasicDataSource) getBean("dataSource");
if (dataSource != null) {
connection = new DatabaseConnection(this.dataSource
.getConnection());

// connection = new DatabaseConnection(this.dataSource
// .getConnection(), "schema");

} else
System.out.println("date source is null !!!!");
}
if (connection != null) {
// System.out.println("开始执行");
oper.execute(connection, dataset);

} else
System.out.println("connection is null!!!");

} catch (DataSetException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DatabaseUnitException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}

protected String[] getConfigLocations() {
return new String[] { "classpath:/applicationContext_test.xml",
"classpath:/beans.xml" };
}

public Object getBean(String beanName) {
if (ctx == null)
ctx = new FileSystemXmlApplicationContext(getConfigLocations());
return ctx.getBean(beanName);
}

}

来看一个具体的测试类:

public class UserDaoTest extends BaseDaoTest {
private String dataSet = "bin/cn/xiangyunsoft/sysadmin/dao/impl/user.xml";//DBUnit需用的文件的位置

private IDao<User> dao = (IDao<User>) getBean("userDao");
public void testSaveOrUpdate() {
execute(dataSet, DatabaseOperation.DELETE_ALL); //测试前准备测试数据环境
Department department =new Department();
department.setId("01");
department.setName("测试部门");
dao.save(department);

User dep = new User();
dep.setId("001");
dep.setName("测试");
dep.setDepartment(department);
Serializable s = dao.save(dep);
System.out.println("保存成功 :" + s);
assertNotNull(s);
execute(dataSet, DatabaseOperation.DELETE); //清除测试时的数据
}

现在来看测试的效果还是可以的。不知道以后遇到更复杂的表好不好用。


Technorati : dao, dbunit

主题:在Spring中结合Dbunit对Dao进行集成单元测试 NULL 博文链接:https://xiangxingchina.iteye.com/blog/1752521 立即下载

相关推荐

对dbunit进行mybatis DAO层Excel单元测试(必看篇)

下面小编就为大家带来一篇对dbunit进行mybatis DAO层Excel单元测试(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

dbunit测试dao_使用DbUnit和Anthill控制您的测试环境

存档日期:2019年5月14日 | 首次发布:2004年4月13日 极限编程方法的诞生使测试驱动的开发和持续集成成为主流Java开发实践。 如果没有正确的工具,将这些技术应用于Java服务器端开发可能很快就成为噩梦。 在本文中,软件开发人员Philippe Girolami描述了如何处理持续集成,以及如何通过在每次测试之前设置数据库状态来将DbUnit与JUnit结合使用以端对端地控制测试...

cusi77914的博客 222

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。

在Spring中结合Dbunit对Dao进行集成单元测试

package com.test.dbunit.dao; import javax.sql.DataSource; import org.dbunit.Assertion; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import or...

DeveloperJ's Knowledge Base 398

CASIA数据集解析:图像篡改检测的黄金标准与实践指南

本文深入解析了CASIA数据集在图像篡改检测领域的核心价值与应用实践。作为中科院自动化所打造的黄金标准,CASIA数据集通过模拟真实篡改场景(如拼接和复制移动)为研究者提供全面支持。文章详细对比了v1.0与v2.0版本差异,分享数据预处理和模型训练的最佳实践,并探讨了未来研究方向,是图像篡改检测领域的重要参考指南。

kappa的博客 784

一文了解向量数据库在RAG中扮演的角色

向量数据库:AI新纪元的基石。探索如何通过这一创新技术优化RAG,提高语言模型的信息处理能力

2401_82452722的博客 2452

Springboot+DBunit单元测试,数据库隔离测试

关于DBunit 百度百科:dbunit是一个基于junit扩展的数据库测试框架。 简言之,dbunit是为了在单元测试中,通过备份数据库、导入测试数据、回滚恢复数据库的手段,在不污染数据库的前提下完成一系列单元测试工作。 DBunit关键知识点 IDataSet接口:用于操作表集合 ITable接口:用于操作表数据集合 DatabaseOperation类:对表数据执行一系列操作,比如刷新、删除...

Oumuv的博客 4948

通过两个mark点确定某一个点的位置

read_image (Image0, '0.bmp') binary_threshold (Image0, Region, 'max_separability', 'dark', UsedThreshold) connection (Region, ConnectedRegions) fill_up (ConnectedRegions, RegionFillUp) select_shape_std (RegionFillUp, SelectedRegions, 'max_area', 70) red...

优快云博客 3887

Spring + DbUnit 测试

Spring dbunitspring-test-dbunit 提供了 Spring 与 DbUnit 的集成,在 Spring 中我们可以使用注解来进行数据的准备和清理。配置为了使用 DbUnit 的注解,我们需要使用 DbUnitTestExecutionListener 类,下面是典型的使用 JUnit 4 的注解@RunWith(SpringJUnit4ClassRunner.class)

zsensei的博客 5952

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

UFS软件分区介绍

本文主要介绍了ufs软件分区管理的概况,能够使大家对软件分区有个大体的认识

肥匪斐's blogs 1万+

dbunit测试dao_用于数据库测试的DBUnit,Spring和注释

dbunit测试dao 如果您曾经尝试用Java编写数据库测试,则可能会遇到DBUnit 。 DBUnit允许您设置和拆除数据库,以便它包含可针对其编写测试的一致行。 通常,您可以通过编写一个简单的XML文档来指定要DBUnit插入的行,例如: <?xml version="1.0" encoding="UTF-8"?> <dataset> <Person ...

最佳 Java 编程 291

Python教程:一文了解Python的深拷贝与浅拷贝

理解 Python 中的深拷贝(deep copy)和浅拷贝(shallow copy)是非常重要的,特别是在处理嵌套结构的数据时。让我们深入探讨这两个概念,并通过代码示例进行说明。

旦莫的博客 3967

依赖数据库的单元测试——DBUnit

官方使用指南:http://dbunit.sourceforge.net/howto.html

wudiyong22的专栏 6900

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2357

2024阅读AOSP源码的正确打开姿势

在Android系统开发中,阅读AOSP(Android Open Source Project)源码是非常重要的环节。然而,如何构建一个优雅的阅读环境却是一个不容忽视的问题。本文将介绍不同工具和方法下阅读AOSP源码的正确姿势,并对比其优缺点。

虎哥LoveDroid 2706

使用DbUnit进行数据库操作的单元测试

1.DbUnit是junit的扩展,主要针对Dao层对数据库操作的单元测试,可以在不改变数据库原始数据的情况下,进行测试。 官网:http://dbunit.sourceforge.net/ 下载地址:http://download.youkuaiyun.com/detail/sanfye/8992365 好了,废话不多说了,其它内容麻烦自己去科普,直接上代码: 2.直接继承 DatabaseTest

sanfye的专栏 7191

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

dao层service层分别使用dbunit以及easymock进行单元测试

Java中经常对service层和dao层进行单元测试,对dao层进行测试可以使用dbunit进行测试,对service可以使用easyMock和spring-test.jar进行测试 (1)dao层使用dbunit进行测试 ①写一个关于Assert的类,这个类主要是用来使用junit进行实际与理想值的比较 import java.util.List; import junit.frame

uestc_lxp的专栏 2495

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

干货:Dao单元测试项目实战

Dao单元测试技术方案:H2+spring-test+spring-test-dbunit+testng 一.* 技术方案的选择*H2:内存数据库,支持标准SQL,相当于把数据库本地化,可以避免对测试环境的依赖,也可以提升单测的速度。spring-test: 提供了@DirtiesContex AbstractTestNGSpringContextTests等诸多注释和基类,可以用来简化单元测试。

技术进阶之路 1677

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring+DBUnit+H2----项目单元测试

        今天够郁闷的,早上调好的代码,到中午调试不同了,分析不出问题,H2的JDBC报错:org.h2.jdbc.JdbcSQLException: Timeout trying to lock table XXX,很是郁闷,居然是锁表了,我什么操作都没干...                 然后只能从H2的链接入手了,原始的连接为:jdbc:h2:~/lobbystat3,不确定...

valder fields 416

使用DBUnit做单元测试

DBUnit是一个方便的数据准备工具, 方便于我们做单元测试的时候准备数据, 它的数据准备是基于XML格式的, 如下: 使用DBUnit, 可以方便的把上面XML中准备的数据插入倒数据库中. 你可能会担心如果是要准备的数据比较多,如上百条,

冯立彬的博客 2万+

Spring的DAO模块数据库操作实例

Spring的DAO模块提供了对了JDBC、Hibernate、JDO等DAO层支持。DAO模块依赖于 ,MyEclipse自带的Spring DAO类库没有这两个类库,需要自己添加。 下面以保存实体Person为例作介绍: 传统的JDBC编程,总免不了与Connection、Statement、PreparedStatement、ResultSet、SQLException等打交

wuruiaoxue的专栏 4837

SpringBoot+DBUnit 单元测试备忘

1. pom文件配置 &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;...

3866

dbunit进行数据库操作的测试

j2ee程序好多都涉及到了数据库操作,这时进行mock测试就没有意义,不如直接在数据库上进行操作. 进行数据库测试有两点要求 1 测试之前数据库要处在一个确定性的状态下. 2 测试不改变数据库的状态. 我觉得比较好的方法是建立一个专用的测试数据库,避免了测试数据的干扰.否则每次测试结束就要进行相应的现场恢复. 假设我们有个开发数据库allcrap,然后建立个测试数据库allcra...

大神带我来搬砖 721
上一篇: icefaces使用经验_ice:panelPopup
下一篇: Acegi终于可以工作了
51liveup
博客等级 码龄24年 9粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值