1.dbunit简介
使用DbUnit,开发人员可以控制测试数据库的状态。进行一个DAO单元测试之前,DbUnit为数据库准备好初始化数据;而在测试结束时,DbUnit会把数据库状态恢复到测试前的状态
2.下载dbunit包
<dependency>
<groupId>dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.2</version>
</dependency>
3.加入slf4j依赖包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
4.创建Dbunit的数据库测试xml文件
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<!-- <t_user>
<id>1</id>
<username>sh</username>
<password>123</password>
<nickname>suhao</nickname>
</t_user> -->
<t_user id="1" username="suhao" password="123" nickname="超级管理员"/>
</dataset>
以上被注释的是另一种方式,两种方式都是可以的
5.创件dbunit的Connection
dbunit的Connnection 是用来对数据文件进行操作的,这个Connection必须依赖于项目中所使用的Connection
IDatabaseConnection connection = new DatabaseConnection(DbUtil.getConnection());
6.创建IDataSet 通过DataSet来 获取测试数据中的数据
/**
* FlagXmlDataSet 用来获取基于属性存储的值
* XmlDataSet 用来基于获取基于节点类型存储的值
*/
IDataSet dataSet = new FlatXmlDataSet(new InputSource(
TestDbUnit.class.getClassLoader().getResourceAsStream(
"t_user.xml")));
7.初始化数据完成测试
@Test
public void testDbunit() {
try {
//创建dbunit的Connection
IDatabaseConnection connection = new DatabaseConnection(
DbUtil.getConnection());
/**
* FlagXmlDataSet 用来获取基于属性存储的值
* XmlDataSet 用来基于获取基于节点类型存储的值
*/
IDataSet dataSet = new FlatXmlDataSet(new InputSource(
TestDbUnit.class.getClassLoader().getResourceAsStream(
"t_user.xml")));
//将数据库中的数据清空 并将测试数据插入
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
IUserDAo userDAo = new UserDAOImpl();
User tu = userDAo.load("suhao");
System.out.println(tu.getId()+"," + tu.getNickname() +","+ tu.getUsername()
+","+ tu.getPassword());
Assert.assertEquals(tu.getId(), 1);
Assert.assertEquals(tu.getUsername(), "suhao");
} catch (Exception e) {
e.printStackTrace();
}
}
然后将看到数据库中插入了数据
但是我们在实际开发中是不允许测试数据破坏原有数据库中的数据的 所以要将数据进行还原
8.数据的还原
1)备份数据()
@Test
public void testBackUpAllTable() {
IDatabaseConnection connection = new DatabaseConnection(
DbUtil.getConnection());
try {
//根据connection 创建相应的IDataSet,这个DataSet包含了所有表
IDataSet createDataSet = connection.createDataSet();
//将createDataSet中的数据通过FlatXmlDataSet 写到文件中
FlatXmlDataSet.write(createDataSet, new FileWriter("/home/suhao/t_user.xml"));
} catch (SQLException e) {
e.printStackTrace();
} catch (DataSetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
以上是备份数据库中所有的表
2)备份数据库中指定的表
@Test
public void testBackUpOneTable() {
// 创建dbunit的Connection
IDatabaseConnection connection = new DatabaseConnection(
DbUtil.getConnection());
//通过QueryDataSet可以有效的选择要处理的表 来作为数据集
try {
QueryDataSet backup = new QueryDataSet(connection);
//添加t_user 这张表作为备份表
backup.addTable("t_user");
FlatXmlDataSet.write(backup, new FileWriter(
"/home/suhao/t_user1.xml"));
} catch (SQLException e) {
e.printStackTrace();
} catch (DataSetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3)还原数据
@Test
public void testResume() {
// 创建dbunit的Connection
IDatabaseConnection connection = new DatabaseConnection(
DbUtil.getConnection());
try {
// 根据备份文件创建DataSet
InputStream inputStream = new FileInputStream("/home/suhao/t_user1.xml");
IDataSet dataSet = new FlatXmlDataSet(new InputSource(
inputStream));
// 将数据库中的数据清空 并将备份数据插入
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} catch (DataSetException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DatabaseUnitException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}