四、dbunit的应用
dbunit框架是为了在Junit测试中测试数据库增删查改时,不会影响数据库的数据。
1.导入jar包
dbunit.jar
slf4j.jar
2.创建dbunit测试数据xml文件,如下:
<t_user><!--结点名称最好命名为要操作的数据库表名-->
<id>1233</id>
<name>sens</name>
</t_user>
或
<t_user id="1233" name="sens" />
3.创建dbunit数据连接Connection
dbunit的Connection是用来对数据文件操作,这个Connection必须依赖于JDBC的Connnection.
4.获取IDataSet,通过IDataSet来获取测试文件xml里的数据
5.初始化数据并完成测试
清空数据库原来数据,然后将测试数据插入到数据库,此时操作的便是测试数据。
IDatabaseConnection conn = new IDatabaseConnection(DBUtil.getConnection());
/*
*FlatXmlDataSet是用来获取基于属性存取的属性值
*XMLDataSet是用来获取基于节点类型存储的节点值
*/
IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbUnit.class.getClassLoa der().getResourceAsStream("t_user.xml"))));
//将测试数据从XML读出,然后清空数据库数据并将测试数据插入到数据库
DatabaseOperation.CLEAN_INSERT.execute(conn,ds);
DatabaseOperation还有其他操作方法,如Delete_Insert等。
6.备份数据库所有表数据
使用IDataSet ds = conn.createDataSet();将数据库所有数据读取到ds中,
然后将ds中数据通过FlatXmlDataSet写入到文件中
FlatXmlDataSet.write(ds,new FileWriter("d:/test.xml"));
7.备份某张表的数据
通过QueryDataSet可以选择备份某张表的数据
QueryDataSet backup = new QueryDataSet(conn);
添加需要备份数据的表名
backup.addTable("t_user");
将ds中数据通过FlatXmlDataSet写入到文件中
FlatXmlDataSet.write(backup,new FileWriter("d:/test2.xml"));
8.还原备份数据到数据库中
与第5步一致,只需要将数据文件名改为我们备份的数据文件就行。
9.综合上面的所讲,下面给出一个综合的例子。
public class TestDbUnit{
@Test
public void testLoad(){
IDatabaseConnection conn = new IDatabaseConnection(DBUtil.getConnection());
/*
*FlatXmlDataSet是用来获取基于属性存取的属性值
*XMLDataSet是用来获取基于节点类型存储的节点值
*/
IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbUnit.class.getClassLoader
().getResourceAsStream("t_user.xml"))));
//将测试数据从XML读出,然后清空数据库数据并将测试数据插入到数据库
DatabaseOperation.CLEAN_INSERT.execute(conn,ds);
//这里就是使用DAO或Service类进行操作数据库数据,此时数据库数据便是测试数据
IUserDAO userDAO = new UserDAOImpl();
User u = userDAO.load("admin");
Assert.assertEquals(u.getId(),1);
Assert.assertEquals(u.getName(),"sens");
Assert.assertEquals(u.getRole(),"admin");
}
@Test
public void testBackupAllTable(){
IDatabaseConnection conn = new IDatabaseConnection(DBUtil.getConnection());
//根据conn创建dataset,这个dataset包含了所有表的数据
IDataSet ds = conn.createDataSet();
//将ds中数据通过FlatXmlDataSet写入到文件中
FlatXmlDataSet.write(ds,new FileWriter("d:/test.xml"));
}
@Test
public void testBackupOneTable(){
IDatabaseConnection conn = new IDatabaseConnection(DBUtil.getConnection());
//通过QueryDataSet可以选择备份某张表的数据
QueryDataSet backup = new QueryDataSet(conn);
//添加需要备份数据的表名
backup.addTable("t_user");
//将ds中数据通过FlatXmlDataSet写入到文件中
FlatXmlDataSet.write(backup,new FileWriter("d:/test2.xml"));
}
@Test
public void testRecoverData(){
IDatabaseConnection conn = new IDatabaseConnection(DBUtil.getConnection());
IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbUnit.class.getClassLoader
().getResourceAsStream("test.xml"))));
DatabaseOperation.CLEAN_INSERT.execute(conn,ds);
}
}
建议:可以将备份放在@Before的初始化方法中,然后将还原数据放在@After的释放资源的方法中。同时,也可以将备份和还原数据的操作独立出来。因为每个操作数据库的测试类都需要用到。这样就可以直接在测试类中@Before和@After中直接调用对应的备份和还原。