在上面的代码中

  1. package com.fjnu.service;
  2.  
  3. import java.io.FileWriter;
  4. import java.sql.SQLException;
  5.  
  6. import static org.junit.Assert.*;
  7.  
  8. import org.dbunit.DatabaseUnitException;
  9. import org.dbunit.database.DatabaseConnection;
  10. import org.dbunit.database.IDatabaseConnection;
  11. import org.dbunit.dataset.IDataSet;
  12. import org.dbunit.dataset.xml.FlatXmlDataSet;
  13. import org.dbunit.dataset.xml.FlatXmlProducer;
  14. import org.dbunit.operation.DatabaseOperation;
  15. import org.junit.Before;
  16. import org.junit.Test;
  17. import org.xml.sax.InputSource;
  18.  
  19. import com.fjnu.model.User;
  20. import com.weiyuan.dao.IUserDao;
  21. import com.weiyuan.dao.UserDao;
  22. import com.weiyuan.dao.UserDaoByHashMapImpl;
  23. import com.weiyuan.test.DBUtils;
  24.  
  25. public class TestDBUtils {
  26.  
  27. @Before
  28. public void setUp(){
  29. // 初始化
  30. System.out.println("setup is called");
  31.  
  32. }
  33. @Test
  34. public void testLoad(){
  35. try {
  36. IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
  37. IDataSet dataSet = new FlatXmlDataSet(new FlatXmlProducer(
  38. new InputSource(TestDBUtils.class.getClassLoader().getResourceAsStream("t_user.xml"))));
  39. //清空数据库中的数据并插入xml中的数据
  40. DatabaseOperation.CLEAN_INSERT.execute(con,dataSet);
  41.  
  42. IUserDao userDao = new UserDao();
  43. User u = userDao.load("admin");
  44. assertEquals(u.getUsername(), "admin");
  45. assertEquals(u.getPassword(), "123");
  46.  
  47. } catch (DatabaseUnitException e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. } catch (SQLException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. }
  55.  
  56. //备份数据库文件
  57. @Test
  58. public void testBackup(){
  59. try {
  60. IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
  61. IDataSet createDataSet = con.createDataSet();
  62. FlatXmlDataSet.write(createDataSet, new FileWriter("d:/test.xml"));
  63. } catch (Exception e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67.  
  68. }
  69.  
  70. //还原数据库文件
  71. @Test
  72. public void testResume(){
  73. try {
  74. IDatabaseConnection con = new DatabaseConnection(DBUtils.getConnection());
  75. IDataSet dataSet = new FlatXmlDataSet(new FlatXmlProducer(
  76. new InputSource("d:/test.xml")));
  77. //清空数据库中的数据并插入xml中的数据
  78. DatabaseOperation.CLEAN_INSERT.execute(con,dataSet);
  79. } catch (Exception e) {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83.  
  84. }
  85.  
  86. }

每次执行一个测试方法都会调用 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保证创建业务类都只执行一次

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

  1.  
  1. package com.weiyuan.dao;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7.  
  8. import org.dbunit.DatabaseUnitException;
  9. import org.dbunit.database.DatabaseConnection;
  10. import org.dbunit.database.IDatabaseConnection;
  11. import org.dbunit.database.QueryDataSet;
  12. import org.dbunit.dataset.DataSetException;
  13. import org.dbunit.dataset.IDataSet;
  14. import org.dbunit.dataset.xml.FlatXmlDataSet;
  15. import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
  16. import org.dbunit.dataset.xml.FlatXmlProducer;
  17. import org.dbunit.operation.DatabaseOperation;
  18. import org.dbunit.util.Base64.InputStream;
  19. import org.junit.BeforeClass;
  20. import org.xml.sax.InputSource;
  21.  
  22. import static org.junit.Assert.*;
  23.  
  24. import com.weiyuan.test.DBUtils;
  25.  
  26. /**
  27. * DBUnit Dao数据库 测试 的抽象类,
  28. * Dao层方法的测试只需继承此类,
  29. * 并调用相应的方法即可完成隔离真实数据层的数据测试
  30. * @author
  31. * 2015.08.11
  32. *
  33. */
  34. public abstract class AbstractDbUnitTestCase {
  35.  
  36. //数据库链接
  37. public static IDatabaseConnection dbunitCon ;
  38. //备份真实数据的文件
  39. private File tempFile ;
  40.  
  41. @BeforeClass
  42. //在类执行之前执行,初始化数据库链接
  43. public static void init() throws Exception{
  44.  
  45. dbunitCon = new DatabaseConnection(DBUtils.getConnection());
  46. }
  47.  
  48. /**
  49. * 构建初始 测试 数据集
  50. * @param tname 要构建的数据集的数据文件名 tname.xml
  51. * @return
  52. * @throws DataSetException
  53. */
  54. protected IDataSet createDataSet(String tname) {
  55. //获取预置数据集
  56. //com.weiyuan.dao对应存在xml文件的路径,这里也可以是文件夹dbutils_xml这个文件夹必须在src目录下
  57. java.io.InputStream is = AbstractDbUnitTestCase.class.getClassLoader().getResourceAsStream("dbutils_xml/"+tname+".xml");
  58.  
  59. assertNotNull("dbunit的基本文件 "+tname+".xml 不存在",is);
  60. //构建数据集
  61. IDataSet dataSet = null;
  62. try {
  63. dataSet = new FlatXmlDataSetBuilder().build(is);
  64. } catch (DataSetException e) {
  65. e.printStackTrace();
  66. }
  67.  
  68. return dataSet ;
  69. }
  70.  
  71. //===========备份真实数据的公共方法==========================================================//
  72.  
  73. /**
  74. * 备份数据表
  75. * @param tname
  76. * @throws DataSetException
  77. * @throws IOException
  78. */
  79. protected void backUpOneTable(String tname) {
  80. backUpCustomTable(new String[]{tname});
  81. }
  82. /**
  83. * 同时备份多张表
  84. * @param tname
  85. * @throws DataSetException
  86. * @throws IOException
  87. */
  88. protected void backUpCustomTable(String[] tname) {
  89. try {
  90. QueryDataSet queryDataSet = new QueryDataSet(dbunitCon);
  91. for(String str : tname){
  92. queryDataSet.addTable(str);
  93. }
  94. writeBackUpFile(queryDataSet);
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. }
  98.  
  99. }
  100.  
  101. /**
  102. * 备份全部的真实数据表
  103. * @author sangwenhao
  104. * 2015.08.10
  105. */
  106. protected void backUpAllTable(){
  107. try {
  108. IDataSet dataSet = dbunitCon.createDataSet();
  109. //保存到物理文件
  110. writeBackUpFile(dataSet);
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114.  
  115. }
  116.  
  117. /**
  118. * 保存临时文件(数据库中真实数据)操作
  119. * @param dataSet
  120. * @author sangwenhao
  121. * 2015.08.11
  122. */
  123. protected void writeBackUpFile(IDataSet dataSet) {
  124.  
  125. try {
  126. tempFile = File.createTempFile("back", "xml");
  127. FlatXmlDataSet.write(dataSet, new FileWriter(tempFile) );
  128. } catch (IOException e) {
  129. e.printStackTrace();
  130. } catch (DataSetException e) {
  131. e.printStackTrace();
  132. }
  133. }
  134.  
  135. /**
  136. * 恢复数据表中的原始数据
  137. * @author sangwenhao
  138. * 2015.08.10
  139. */
  140. protected void resumeTable() {
  141. try {
  142. //读取 备份的真实数据集
  143. IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(new FileInputStream(tempFile))));
  144. //执行 插入数据 操作
  145. DatabaseOperation.CLEAN_INSERT.execute(dbunitCon, ds);
  146.  
  147. } catch (Exception e) {
  148. e.printStackTrace();
  149. }
  150.  
  151. }
  152.  
  153. /**
  154. * 销毁链接
  155. * @author sangwenhao
  156. * 2015.08.10
  157. */
  158. protected void destory() {
  159. try {
  160. if(dbunitCon != null) dbunitCon.close();
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. }
  164.  
  165. }
  166. }
  1.  
  1. 接下来编写我们的测试类
  1. package com.fjnu.service;
  2.  
  3. import static org.junit.Assert.*;
  4.  
  5. import java.sql.SQLException;
  6.  
  7. import org.dbunit.DatabaseUnitException;
  8. import org.dbunit.database.DatabaseConnection;
  9. import org.dbunit.dataset.IDataSet;
  10. import org.dbunit.operation.DatabaseOperation;
  11. import org.junit.After;
  12. import org.junit.Before;
  13. import org.junit.BeforeClass;
  14. import org.junit.Test;
  15.  
  16. import com.fjnu.model.User;
  17. import com.weiyuan.dao.AbstractDbUnitTestCase;
  18. import com.weiyuan.dao.UserDao;
  19. import com.weiyuan.dao.UserDaoByHashMapImpl;
  20. import com.weiyuan.test.DBUtils;
  21.  
  22. /*
  23. * 因为TestDBUtilsUserService继承AbstractDbUnitTestCase
  24. * TestDBUtilsUserService在创建都会调用@BeforeClass
  25. //在类执行之前执行,初始化数据库链接
  26. public static void init() throws Exception{
  27.  
  28. dbunitCon = new DatabaseConnection(DBUtils.getConnection());
  29. }
  30. init方法之后调用一次
  31. *
  32. * */
  33. public class TestDBUtilsUserService extends AbstractDbUnitTestCase {
  34. private IUserService us;
  35. private User baseUser;
  36. IDataSet dataSet ;
  37.  
  38. //该方法每次在调用任何测试方法都会被调用
  39. @Before
  40. public void setUp(){
  41. // 初始化
  42. System.out.println("setup is called");
  43. us = new UserService(new UserDao());
  44. //调用任何测试方法之前都备份t_user表的原始任何数据
  45. backUpOneTable("t_user");
  46. baseUser = new User("admin", "123", "管理员");
  47. //调用任何测试方法之前都通过xml文件创建测试数据
  48. dataSet = createDataSet("t_user");
  49. }
  50.  
  51. private void assertUserEquals(User u, User tu){
  52. assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());
  53. assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());
  54. assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());
  55. }
  56. @Test
  57. public void testLoad(){
  58.  
  59. try {
  60. DatabaseOperation.CLEAN_INSERT.execute(dbunitCon, dataSet);
  61. User u = us.load("admin");
  62. assertUserEquals(u,baseUser);
  63. } catch (DatabaseUnitException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. } catch (SQLException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70.  
  71. }
  72.  
  73. @After
  74. public void tearDown(){
  75. resumeTable();
  76. }
  77.  
  78. }
  1.  

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

  1.  项目的下载地址是:
    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. Linux SCP命令远程复制文件

    从本地复制到远程 scp 本地文件 远程用户名@远程地址:远程目录(此命令回车后会要求输入密码,验证通过后会把本地文件复制到远程目录中,文件名不变) 或者 scp 本地文件 远程用户名@远程地址:远程 ...

  2. windows核心编程课程实践---多线程文件搜索器(MFC界面)

    课上完了连老师见都没见一面QAQ....记录一下该小项目 效果如下: 1.实现文件搜索功能,并封装为类 1)首先是文件搜索类Rapidfinder的构造函数和析构函数和文件信息初始化函数和文件路径规格 ...

  3. 微信小程序路由跳转(navigateTo,redirectTo ,switchTab ,reLaunch )

    navigateTo, redirectTo 只能打开非 tabBar 页面. switchTab 只能打开 tabBar 页面. reLaunch 可以打开任意页面. 通过redirect重定向的页 ...

  4. Rocket - tilelink - Parameters

    https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ   简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析).   ​​   ...

  5. Chisel3 - util - Math vs. CircuitMath

    https://mp.weixin.qq.com/s/8lC8vQnBdKW9C39H0QFFkA     对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现.   ...

  6. Java实现 LeetCode 736 Lisp 语法解析(递归)

    736. Lisp 语法解析 给定一个类似 Lisp 语句的表达式 expression,求出其计算结果. 表达式语法如下所示: 表达式可以为整数,let 语法,add 语法,mult 语法,或赋值的 ...

  7. Java实现k个数乘(cheng)(自然数的k乘积问题)

    k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...

  8. Java实现 蓝桥杯 历届试题 翻硬币

    问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...

  9. java实现第六届蓝桥杯四阶幻方

    四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以 及两个对角线的和都相等,满足这样的特征时称 为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1 ,请计算一共有多少种方案. 比如: ...

  10. 阿里云高级技术专家空见: CDN的数据化之路

    想要实现优质高速的互联网视频服务,一定离不开高质量的内容分发网络服务,就是我们常说的CDN,在10月13日云栖大会视频多媒体分论坛上,阿里云高级技术专家空见为大家讲解了CDN服务过程中,数据处理.安全 ...