ibatis + dbunit 应用实例

1. web.xml:

 <!-- Context Configuration locations for Spring XML files -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   /WEB-INF/config/applicationContext*.xml
  </param-value>
 </context-param>

2. WEB-INF/config/applicationContext-ibatis.xml
配置一个SQLMapClient:

    <!-- SqlMap setup for iBATIS Database Layer -->
    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation">
            <value>classpath:/com/xxxx/dao/ibatis/sql-map-config.xml</value>
        </property>
        <property name="dataSource" ref="dataSource"/>
    </bean>

将这个 SQLMapClient 和 dataSource(可能在另一个applicationContext*.xml
中装配) 织入到我们的每个DAO中:

    <!-- ZoneDao: iBatis implementation -->
    <bean id="ZoneDao" class="com.xxxx.dao.ibatis.ZoneDaoiBatis">
        <property name="dataSource" ref="dataSource"/>
        <property name="sqlMapClient" ref="sqlMapClient"/> 
    </bean>

这样我们的iBatis就可以工作了,可以专注于每个业务模块的实现了。

3.dbunit没什么好配置的,我们只需一个继承自junit.framework.TestCase类的抽象类。代码大致如下:

package com.xxxx.dao;

import java.sql.Connection;

import javax.sql.DataSource;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.ITable;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public abstract class TestCase extends junit.framework.TestCase {

 private static DataSource dataSource;

 private ApplicationContext ctx = null;

 public ApplicationContext getApplicationContext() {
  return ctx;
 }

 /**
  * Returns DB connection for DbUnit.
  */
 protected IDatabaseConnection getConnection() throws Exception {
  Class.forName("com.mysql.jdbc.Driver");
  // set test database
  Connection jdbcConnection = dataSource.getConnection();
  return new DatabaseConnection(jdbcConnection, "数据库名");
 }

 public TestCase(String x) {
  super(x);
 }

 protected void setUp() throws Exception {
  if (ctx == null) {
   String[] paths = {
     "applicationContext-test.xml"           //里面可能配置了用于测试的SQLMapClient和dataSource两个bean
     };
   ctx = new ClassPathXmlApplicationContext(paths);
  }
  if (dataSource == null) {
   dataSource = (DataSource) ctx.getBean("dataSource");
  }
 }
 
 protected DataSource getDataSource() {
  return dataSource;
 }
 
    /**
  * get table data in database.
  *
  * @param tableName
  *            table's name
  * @return table object
  * @throws Exception
  *             exception
  */
    public ITable getTableFromDB(String tableName) throws Exception {
        return getConnection().createDataSet().getTable(tableName);
    }
}
而后,所有应用模块的DAO测试类都继承自这个抽象的TestCase就可以了。例子如下:

public class ZoneDaoiBatisTest extends TestCase {

 IDataSet dataSet;

 private ZoneDao dao = null;
 
 public ZoneDaoiBatisTest(String x) {
  super(x);
 }

 protected void setUp() throws Exception {
  super.setUp();
  ZoneDaoiBatis daoImpl = new ZoneDaoiBatis();
  daoImpl.setDataSource(this.getDataSource());
  daoImpl.setSqlMapClient((SqlMapClient) this.getApplicationContext()
    .getBean("sqlMapClient"));
  dao = daoImpl;
  dataSet = new FlatXmlDataSet(
    ZoneDaoiBatisTest.class
      .getResourceAsStream("../dataset/ZoneDaoTest_before.xml"));         //启动测试时要转载的xml数据文件
  DatabaseOperation.CLEAN_INSERT.execute(getConnection(), dataSet);
 }

 public void testAddZone() throws Exception {
  Zone zone = new Zone();
  City city = new City();
  city.setCityId("021");
  zone.setCity(city);
  zone.setName("黄浦区");
  zone.setZoneId("200000");
  dao.addZone(zone);  
  ITable actualTable = this.getTableFromDB("zone");
        IDataSet expectedDataSet = new FlatXmlDataSet(
         StoreDaoiBatisTest.class
             .getResourceAsStream("../dataset/ZoneDaoTest_afterInsert.xml"));        //执行这个测试后希望得到的数据(xml文件形式)
        ITable expectedTable = expectedDataSet.getTable("zone");  
  actualTable = DefaultColumnFilter.includedColumnsTable(
                actualTable, expectedTable.getTableMetaData().getColumns());
        Assertion.assertEquals(new SortedTable(expectedTable),
                new SortedTable(actualTable));
 } 

 . . .  . . .

}

4.最后的工作当然就是点右键,执行run as JUnit Test,如果代码有问题它会告诉你的,然后自己改错去吧!  :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值