DbUnit是一个可以让我们在测试开始前初始化我们的数据库,例如准备我们的数据,然后在测试结束后也可以回滚我们的数据库(不是自动进行的,需要手工编码),dbUnit的结构基于Jnit,简单的使用必须要继承DatabaseTestCase类,但是我们可以使用编码的方法调用他,完全可以在Spring环境下使用,然后在TestNG中调用。
我写了一个DbunitTemplate类做了一个小小的封装。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
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.operation.DatabaseOperation;
public class DBUnitTemplate {
private BasicDataSource dataSource;
private IDatabaseConnection connection;
public DBUnitTemplate(){
}
public void setDataSource(BasicDataSource dataSource) throws SQLException {
this.dataSource = dataSource;
//”schema”是你数据库的schema的名字,试验的时候老是抛出AmbiguousTableNameException,后来在Dbunit的官方FAQ中找到,必须要用schema,而且如果你用的Oracle,必须要大写
connection = new DatabaseConnection(this.dataSource.getConnection(),"schema");
}
public void execute(String path,DatabaseOperation oper) throws FileNotFoundException, IOException, DatabaseUnitException, SQLException{
IDataSet dataset = new FlatXmlDataSet(new FileInputStream(path));
oper.execute(connection,dataset);
}
}
然后在Spring文件中配置它
<bean id="dbUnitTemplate" class="DBUnitTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<property name="maxActive">
<value>${maxActive}</value>
</property>
<property name="maxWait">
<value>${maxWait}</value>
</property>
<property name="maxIdle">
<value>${maxIdle}</value>
</property>
</bean>
只要将dataSource注入到DBUnitTemplate中就可以了
然后我们就可以在TestNG的配置方法中对数据库进行操作了
public class TestDAO {
@Configuration(beforeTestMethod=true)
public void configDB()
throws FileNotFoundException, IOException, DatabaseUnitException, SQLException{
//得到Spring容器,TestConfiguration是自己写的在测试开始前初始化Spring容器的类
ApplicationContext context = TestConfiguration.getContext();
//从容器中得到DBUnitTemplate
DBUnitTemplate dbtemp =
(DBUnitTemplate)context.getBean(“dbUnitTemplate”);
//执行数据库操作,下面将DataSet中的数据插入到数据库中
dbtemp.execute("dataset.xml",--------à你的DataSet的路径
DatabaseOperation.INSERT); --------à你要执行的操作,常用的几种(INSERT,DELETE,UPDATE,CLEAN_INSERT,SELETE_ALL)
}
@Test
public void test(){
//下面可以测试你的类了
}
}
应该比较简单了,另外Spring容器本身就是要启动的,并不会造成额外的负担,这样就不要硬编码连接数据库了,但是DBUnit还是让人不是很满意
1. DataSet的管理还是很烦,并不比管理sql语句好多少
2. 没法查询数据库,我的想法是如果我在测试中对数据库做了某项操作,(例如新增或删除),可以被detect到,然后判断和我预期的结果是不是一致。
可是没办法,也没有别的工具好用的。
posted on 2005-12-31 12:27
fanta 阅读(6132)
评论(2) 编辑 收藏 所属分类:
Java