为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也是平时经常可以看到的DAO了;由于是对数据库的操作,必然有事务的问题了;如果是启动应用服务器,然后再模拟一个请求来验证Dao中的代码写得是否正确的话,那么面临的问题 首先是 速度的问题也是效率的问题,如果你的应用很大的话那么但tomcat的启动花费了一分钟左右的时间,如果用的服务器是weblogic的话更加不用说了 其实是问题的主次问题,我们现在要做的正事是测试Dao 但是如果放到服务器里面测试的话 可能有些问题不是dao的问题了,但是我们必须解决,这样做 显然很多时候有点本末倒置了 ;因此我采用的方法是利用spring+ibatis+junit在本地测试的方法 大体步骤如下
  一  建立一个测试的基类 AbstractTestCase 代码如下
  package com.skywin.workorder.dao;
  import org.springframework.context.ApplicationContext;
  import org.springframework.context.support.ClassPathXmlApplicationContext;
  import junit.framework.TestCase;
  public abstract class AbstractTestCase extends TestCase {
  protected ApplicationContext ctx = null;
  public AbstractTestCase() {
  // 测试工作流
  //ctx = new ClassPathXmlApplicationContext("testApplicationContext.xml");
  // 测试DAO
  ctx =new ClassPathXmlApplicationContext(
  "_applicationContext-iBatis.xml");
  }
  }
  二 第一步中文件 _applicationContext-iBatis.xml 的路径为 工程名字conf\_applicationContext-iBatis.xml ,是spring的配置文件进行事务属性等相关配置  代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--
<import  resource="classpath:_applicationContext-authrization.xml"/>
-->
<import  resource="classpath:workorder-module.xml"/>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc-template.properties</value>
</list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
</bean>
<!--
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@10.244.112.130:41521:gmcctest"/>
<property name="username" value="gmcc"/>
<property name="password" value="gmcc"/>
<property name="initialSize" value="1"/>
<property name="maxActive" value="15"/>
</bean>
-->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="sqlmap-config-template.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<!--  instead of  select .. for update
<prop key="global*">
PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE
</prop>
-->
</props>
</property>
</bean>
</beans>