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,如果代码有问题它会告诉你的,然后自己改错去吧! :)