springboot整合dbunit
中国加油,武汉加油!
项目准备
- 本案例基于【springboot篇】九. springboot整合ssm
- 导入dbunit的相关依赖
<!-- springboot对dbunit测试的支持--> <dependency> <groupId>com.github.springtestdbunit</groupId> <artifactId>spring-test-dbunit</artifactId> <version>1.3.0</version> <scope>test</scope> </dependency> <!-- dbunit包 --> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.5.3</version> </dependency>
1. 案例
1.1 写基类
package com.wpj.utils;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.AmbiguousTableNameException;
import org.dbunit.database.DatabaseConnection;
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.FlatXmlProducer;
import org.dbunit.operation.DatabaseOperation;
import org.xml.sax.InputSource;
import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
public class AbstractDbunitTestCase {
private DatabaseConnection conn; // 封装的链接对象
private File tempFile; // 临时文件
private IDataSet dataSet;
public AbstractDbunitTestCase(String testDataName) throws DatabaseUnitException {
dataSet = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(AbstractDbunitTestCase.class.getClassLoader().getResourceAsStream(testDataName))));
}
/**
* 初始化DatabaseConnection
* @param connection
* @throws DatabaseUnitException
*/
public void setConn(Connection connection) throws DatabaseUnitException {
this.conn = new DatabaseConnection(connection);
}
/**
* 备份多个包
* @param tabNames
*/
public void backManyTable(String... tabNames) throws DataSetException, IOException {
QueryDataSet dataSet = new QueryDataSet(conn);
// 设置要备份的表
for (String tabName : tabNames) {
dataSet.addTable(tabName);
}
tempFile = File.createTempFile("back",".xml");
FlatXmlDataSet.write(dataSet, new FileOutputStream(tempFile));
}
/**
* 备份一张表
* @param tabName
*/
public void backOneTable(String tabName) throws IOException, DataSetException {
backManyTable(tabName);
}
/**
* 插入测试数据
*/
public void insertTestData() throws DatabaseUnitException, SQLException {
DatabaseOperation.CLEAN_INSERT.execute(conn,dataSet);
}
/**
* 还原表数据
*/
public void resumeTable() throws DatabaseUnitException, SQLException, FileNotFoundException {
IDataSet dataSet = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(new FileInputStream(tempFile))));
DatabaseOperation.CLEAN_INSERT.execute(conn,dataSet);
}
}
1.2 写xml
<?xml version='1.0' encoding='UTF-8' ?>
<dataset>
<user id="10" name="jiekami" pwd="123456"></user>
</dataset>
1.3 写测试
package com.wpj.mapper;
import com.wpj.Application;
import com.wpj.pojo.User;
import com.wpj.utils.AbstractDbunitTestCase;
import org.dbunit.DatabaseUnitException;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class TestUserMapper extends AbstractDbunitTestCase {
private User exUser; // 期望返回的数据
@Autowired
private DataSource dataSource;
@Autowired
private UserMapper userMapper;
public TestUserMapper() throws DatabaseUnitException {
super("testdata.xml");
}
@Before // 前置通知
public void init() throws SQLException, DatabaseUnitException, IOException {
exUser = new User(10,"jiekami","123456");
setConn(dataSource.getConnection());
backOneTable("user");
insertTestData();
}
@Test
public void testFindUserById(){
User acUser = userMapper.findUserById(10);
//断言 判断请求回来的数据是否和预期的一致
Assert.assertEquals(exUser.getId(),acUser.getId());
Assert.assertEquals(exUser.getName(),acUser.getName());
Assert.assertEquals(exUser.getPwd(),acUser.getPwd());
}
/**
* 还原数据
*/
@After
public void destory() throws FileNotFoundException, DatabaseUnitException, SQLException {
resumeTable();
}
}