posts - 32,comments - 75,trackbacks - 0

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); --------à你要执行的操作,常用的几种(INSERTDELETEUPDATECLEAN_INSERT,SELETE_ALL

    }

   

    @Test

    public void test(){

        //下面可以测试你的类了

    }

}

应该比较简单了,另外Spring容器本身就是要启动的,并不会造成额外的负担,这样就不要硬编码连接数据库了,但是DBUnit还是让人不是很满意

1.  DataSet的管理还是很烦,并不比管理sql语句好多少

2.  没法查询数据库,我的想法是如果我在测试中对数据库做了某项操作,(例如新增或删除),可以被detect到,然后判断和我预期的结果是不是一致。

可是没办法,也没有别的工具好用的。
posted on 2005-12-31 12:27 fanta 阅读(6130) 评论(2)  编辑  收藏 所属分类: Java

FeedBack:
# re: 在Spring环境下结合TestNG使用DbUnit
2007-03-06 14:18 | peixubin
可以用sqlunit来作啊  回复  更多评论
  
# re: 在Spring环境下结合TestNG使用DbUnit
2010-09-14 15:35 | 咖啡茶
您好!我使用dbunit导出的中文是& #23567;& #24352;的形式,请问您怎么解决?(&和#中间我加入了空格,防止页面自动转换)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: