在上面的代码中

package com.fjnu.service;

import java.io.FileWriter;
import java.sql.SQLException; import static org.junit.Assert.*; import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;
import org.xml.sax.InputSource; import com.fjnu.model.User;
import com.weiyuan.dao.IUserDao;
import com.weiyuan.dao.UserDao;
import com.weiyuan.dao.UserDaoByHashMapImpl;
import com.weiyuan.test.DBUtils; public class TestDBUtils { @Before
public void setUp(){
// 初始化
System.out.println("setup is called"); }
@Test
public void testLoad(){
try {
IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
IDataSet dataSet = new FlatXmlDataSet(new FlatXmlProducer(
new InputSource(TestDBUtils.class.getClassLoader().getResourceAsStream("t_user.xml"))));
//清空数据库中的数据并插入xml中的数据
DatabaseOperation.CLEAN_INSERT.execute(con,dataSet); IUserDao userDao = new UserDao();
User u = userDao.load("admin");
assertEquals(u.getUsername(), "admin");
assertEquals(u.getPassword(), "123"); } catch (DatabaseUnitException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //备份数据库文件
@Test
public void testBackup(){
try {
IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
IDataSet createDataSet = con.createDataSet();
FlatXmlDataSet.write(createDataSet, new FileWriter("d:/test.xml"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } //还原数据库文件
@Test
public void testResume(){
try {
IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
IDataSet dataSet = new FlatXmlDataSet(new FlatXmlProducer(
new InputSource("d:/test.xml")));
//清空数据库中的数据并插入xml中的数据
DatabaseOperation.CLEAN_INSERT.execute(con,dataSet);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

每次执行一个测试方法都会调用 IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());创建一个连接对象,不太好,我们只希望在一个测试业务类中创建一个连接对象,如何实现了

可以使用

JUnit4使用Java5中的注解(annotation),以下是JUnit4常用的几个annotation:
@Before:初始化方法 对于每一个测试方法都要执行一次(注意与BeforeClass区别,后者是对于所有方法执行一次)
@After:释放资源 对于每一个测试方法都要执行一次(注意与AfterClass区别,后者是对于所有方法执行一次)
@Test:测试方法,在这里可以测试期望异常和超时时间
@Test(expected=ArithmeticException.class)检查被测方法是否抛出ArithmeticException异常
@Ignore:忽略的测试方法
@BeforeClass:针对所有测试,只执行一次,且必须为static void
@AfterClass:针对所有测试,只执行一次,且必须为static void

我们使用@BeforeClass保证创建业务类都只执行一次

我们首先在原来的基础上封装一个抽象类


package com.weiyuan.dao;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException; import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.dataset.xml.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.dbunit.util.Base64.InputStream;
import org.junit.BeforeClass;
import org.xml.sax.InputSource; import static org.junit.Assert.*; import com.weiyuan.test.DBUtils; /**
* DBUnit Dao数据库 测试 的抽象类,
* Dao层方法的测试只需继承此类,
* 并调用相应的方法即可完成隔离真实数据层的数据测试
* @author
* 2015.08.11
*
*/
public abstract class AbstractDbUnitTestCase { //数据库链接
public static IDatabaseConnection dbunitCon ;
//备份真实数据的文件
private File tempFile ; @BeforeClass
//在类执行之前执行,初始化数据库链接
public static void init() throws Exception{ dbunitCon = new DatabaseConnection(DBUtils.getConnection());
} /**
* 构建初始 测试 数据集
* @param tname 要构建的数据集的数据文件名 tname.xml
* @return
* @throws DataSetException
*/
protected IDataSet createDataSet(String tname) {
//获取预置数据集
//com.weiyuan.dao对应存在xml文件的路径,这里也可以是文件夹dbutils_xml这个文件夹必须在src目录下
java.io.InputStream is = AbstractDbUnitTestCase.class.getClassLoader().getResourceAsStream("dbutils_xml/"+tname+".xml"); assertNotNull("dbunit的基本文件 "+tname+".xml 不存在",is);
//构建数据集
IDataSet dataSet = null;
try {
dataSet = new FlatXmlDataSetBuilder().build(is);
} catch (DataSetException e) {
e.printStackTrace();
} return dataSet ;
} //===========备份真实数据的公共方法==========================================================// /**
* 备份数据表
* @param tname
* @throws DataSetException
* @throws IOException
*/
protected void backUpOneTable(String tname) {
backUpCustomTable(new String[]{tname});
}
/**
* 同时备份多张表
* @param tname
* @throws DataSetException
* @throws IOException
*/
protected void backUpCustomTable(String[] tname) {
try {
QueryDataSet queryDataSet = new QueryDataSet(dbunitCon);
for(String str : tname){
queryDataSet.addTable(str);
}
writeBackUpFile(queryDataSet);
} catch (Exception e) {
e.printStackTrace();
} } /**
* 备份全部的真实数据表
* @author sangwenhao
* 2015.08.10
*/
protected void backUpAllTable(){
try {
IDataSet dataSet = dbunitCon.createDataSet();
//保存到物理文件
writeBackUpFile(dataSet);
} catch (Exception e) {
e.printStackTrace();
} } /**
* 保存临时文件(数据库中真实数据)操作
* @param dataSet
* @author sangwenhao
* 2015.08.11
*/
protected void writeBackUpFile(IDataSet dataSet) { try {
tempFile = File.createTempFile("back", "xml");
FlatXmlDataSet.write(dataSet, new FileWriter(tempFile) );
} catch (IOException e) {
e.printStackTrace();
} catch (DataSetException e) {
e.printStackTrace();
}
} /**
* 恢复数据表中的原始数据
* @author sangwenhao
* 2015.08.10
*/
protected void resumeTable() {
try {
//读取 备份的真实数据集
IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(new FileInputStream(tempFile))));
//执行 插入数据 操作
DatabaseOperation.CLEAN_INSERT.execute(dbunitCon, ds); } catch (Exception e) {
e.printStackTrace();
} } /**
* 销毁链接
* @author sangwenhao
* 2015.08.10
*/
protected void destory() {
try {
if(dbunitCon != null) dbunitCon.close();
} catch (Exception e) {
e.printStackTrace();
} }
}

接下来编写我们的测试类
package com.fjnu.service;

import static org.junit.Assert.*;

import java.sql.SQLException;

import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test; import com.fjnu.model.User;
import com.weiyuan.dao.AbstractDbUnitTestCase;
import com.weiyuan.dao.UserDao;
import com.weiyuan.dao.UserDaoByHashMapImpl;
import com.weiyuan.test.DBUtils; /*
* 因为TestDBUtilsUserService继承AbstractDbUnitTestCase
* TestDBUtilsUserService在创建都会调用@BeforeClass
//在类执行之前执行,初始化数据库链接
public static void init() throws Exception{ dbunitCon = new DatabaseConnection(DBUtils.getConnection());
}
init方法之后调用一次
*
* */
public class TestDBUtilsUserService extends AbstractDbUnitTestCase {
private IUserService us;
private User baseUser;
IDataSet dataSet ; //该方法每次在调用任何测试方法都会被调用
@Before
public void setUp(){
// 初始化
System.out.println("setup is called");
us = new UserService(new UserDao());
//调用任何测试方法之前都备份t_user表的原始任何数据
backUpOneTable("t_user");
baseUser = new User("admin", "123", "管理员");
//调用任何测试方法之前都通过xml文件创建测试数据
dataSet = createDataSet("t_user");
} private void assertUserEquals(User u, User tu){
assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());
assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());
assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());
}
@Test
public void testLoad(){ try {
DatabaseOperation.CLEAN_INSERT.execute(dbunitCon, dataSet);
User u = us.load("admin");
assertUserEquals(u,baseUser);
} catch (DatabaseUnitException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } @After
public void tearDown(){
resumeTable();
} }

整个工程的项目路径如下所示

 项目的下载地址是:
https://pan.baidu.com/s/15zkog89J75tbgiOPF3cmdA
密码 ycva

06.DBUnit实际运用的更多相关文章

  1. 《HelloGitHub月刊》第06期

    前言 <HelloGitHub>月刊做到第06期了(已经做了6个月了),在GitHub上获得了100+的stars,虽然不多,但是我很知足了,说明有人觉得这个项目是有价值的.同时园子中的' ...

  2. iOS系列 基础篇 06 标签和按钮 (Label & Button)

    iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...

  3. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  4. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  5. javascript基础06

      javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...

  6. Linux 第06天

    Linux 第06天 1.SAMBA服务器————(linux和windows的文件共享) 1.1 安装 yum install samba -yum 1.2 配置文件 /etc/samba/smb. ...

  7. plsql11.06注册码

    plsql11.06注册码:Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number(序列号):601769password ...

  8. org.dbunit.database.ambiguoustablenameexception

    对于一个数据库下面多个shema的情况,如果使用DBUNIT配置会出现,上面的错误,不清楚的表名,解决如下 增加红色的shema指定 参考:http://stackoverflow.com/quest ...

  9. 转:使用DBUnit测试时违反外键约束的解决办法

    DBUnit是一个基于junit扩展的数据库测试框架.它提供了大量的类对与数据库相关的操作进行了抽象和封装.它会把数据库表里的数据和一个xml文件关联起来,也就是说它可以让数据在XML文件和数据库之间 ...

随机推荐

  1. 记一次使用windbg排查内存泄漏的过程

    一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: ...

  2. [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent

    作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...

  3. vc程序设计-----位图

    // resource_study.cpp : 定义应用程序的入口点. // #include "framework.h" #include "resource_stud ...

  4. Java实现 蓝桥杯 算法训练 K好数

    算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...

  5. Java实现 蓝桥杯 算法提高 学霸的迷宫

    算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...

  6. Java实现 LeetCode 363 矩形区域不超过 K 的最大数值和

    363. 矩形区域不超过 K 的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,- ...

  7. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  8. Java实现 LeetCode 8 字符串转换整数(atoi)

    8. 字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  9. java实现输入信用卡号码

    /* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过 Luhn 算法来验证通过. 该校验的过程: 1.从卡号最后一 ...

  10. java实现第七届蓝桥杯方格填数

    方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...