`
sunbin
  • 浏览: 354365 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

web工程中spring+ibatis的单元测试-转

 
阅读更多

 

 

 

为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的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>

 

三 第二步中涉及DataSource,其配置信息包含在 jdbc-template.properties 文件中 文件路径为

工程目录\conf\jdbc-template.properties 代码如下

# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "applicationContext.xml".
# Targeted at system administrators, to avoid touching the context XML files.

#jdbc.driverClassName=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/mps
#jdbc.username=root
#jdbc.password=skywin

jdbc.initialSize=1
jdbc.maxActive=10



jdbc.driverClassName=oracle.jdbc.OracleDriver
#jdbc.url=jdbc:oracle:thin:@10.244.112.130:41521:gmcctes
#jdbc.url=jdbc:oracle:thin:@10.244.112.130:1521:gmccmpp
jdbc.url=jdbc:oracle:thin:@192.168.100.235:1521:mpptest
jdbc.username=gmcc
jdbc.password=skywin

#imageDatabase.lobHandler=oracleLobHandler

 

 

三 第二步中的   <property name="configLocation" value="sqlmap-config-template.xml"/> 为ibatis的中枢文件 文件路径是   工程目录\conf\sqlmap-config-template.xml 代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<!-- Leonel Wong 2008-11-6 17:24:04 -->
<sqlMapConfig>
    <sqlMap resource="ibatis-conf/MpsAppendixInf.xml" />
    <sqlMap resource="ibatis-conf/MpsDispatchLog.xml" />
    <sqlMap resource="ibatis-conf/MpsFunctionType.xml" />
    <sqlMap resource="ibatis-conf/MpsFundType.xml" />
    <sqlMap resource="ibatis-conf/MpsInGatewayInf.xml" />
    <sqlMap resource="ibatis-conf/MpsModuleInf.xml" />
    <sqlMap resource="ibatis-conf/MpsOperationType.xml" />
    <sqlMap resource="ibatis-conf/MpsOrderClaimant.xml" />
    <sqlMap resource="ibatis-conf/MpsPayType.xml" />
    <sqlMap resource="ibatis-conf/MpsProcessApproveLog.xml" />
    <sqlMap resource="ibatis-conf/MpsProcessLog.xml" />
    <sqlMap resource="ibatis-conf/MpsProcessRemark.xml" />
    <sqlMap resource="ibatis-conf/MpsReceiveOrderLog.xml" />
    <sqlMap resource="ibatis-conf/MpsServiceInfo.xml" />
    <sqlMap resource="ibatis-conf/MpsUploadFile.xml" />
    <sqlMap resource="ibatis-conf/MpsUrgentLevel.xml" />
    <sqlMap resource="ibatis-conf/MpsVerifyLog.xml" />
    <sqlMap resource="ibatis-conf/MpsWorkOrder.xml" />
    <sqlMap resource="ibatis-conf/MpsWorkOrderCancelLog.xml" />
    <sqlMap resource="ibatis-conf/MpsWorkOrderCloseLog.xml" />
    <sqlMap resource="ibatis-conf/MpsWorkOrderType.xml" />
    <sqlMap resource="ibatis-conf/MpsOperatorInf.xml" />
    <sqlMap resource="ibatis-conf/MpsOrderServiceInfo.xml" />
    <sqlMap resource="ibatis-conf/MpsTree.xml" />
    <sqlMap resource="ibatis-conf/MpsOperatorTree.xml" />
   
<sqlMap resource="ibatis-conf/MpsTest.xml" />

    <sqlMap resource="ibatis-conf/MpsSpInfo.xml" />
</sqlMapConfig>

 

四 ormpping文件,这里以MpsTest.xml文件为例子,该文件路径是

       工程目录/conf\ibatis-conf\MpsTest.xml 代码如下:

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<!-- qjk 2009-02-02 -->
<sqlMap namespace="MpsTest">

    <resultMap id="result" class="com.skywin.workorder.model.MpsTest">
        <result property="testId" column="testid" columnIndex="1" />
        <result property="mpsWorkOrder.orderId" column="orderid" columnIndex="2" />
        <result property="wfid" column="wfid" columnIndex="3" />
        <result property="testResult" column="testResult" columnIndex="4" />
        <result property="testDate" column="testdate" columnIndex="5" />
        <result property="testPerson" column="testPerson" columnIndex="6" />
        <result property="testDesc" column="testDesc" columnIndex="7" />
    </resultMap>
   
   
<insert id="saveMpsTest">
         insert into wo_test(testid,orderid,wfid,testResult,testdate,testPerson,testDesc)
         values(#testId#,#mpsWorkOrder.orderId#,#wfid#,#testResult#,#testDate#,#testPerson#,#testDesc#)
    </insert>

   
    <delete id="deleteMpsTestById">
       delete from wo_test where testid=#value#
    </delete>
   
    <select id="findAllMpsTest" resultMap="result">
        select * from wo_test
    </select>
   
    <select id="findAllMpsTestCount" resultClass="Long">
       select count(*) from wo_test
    </select>
   
    <select id="findMpsTestNextSeq" resultClass="Long">
         select wo_test_seq.nextval from dual
    </select>
   
   
   
   
</sqlMap>

 

 

五 dao实现类代码:

 

package com.skywin.workorder.dao.Impl;

import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.skywin.workorder.dao.MpsTestDao;
import com.skywin.workorder.model.MpsTest;
import com.skywin.workorder.util.ListResult;

public class MpsTestDaoImpl extends SqlMapClientDaoSupport implements MpsTestDao {

    public int deleteMpsTestById(Long testId) {
        return getSqlMapClientTemplate().delete("deleteMpsTestById", testId);
    }

    public List findAllMpsTest(int pagesize, int pageIndex) {
        return getSqlMapClientTemplate().queryForList("findAllMpsTest", null, pageIndex*pagesize, pagesize);
    }

    public Long findAllMpsTestCount() {
        return (Long) getSqlMapClientTemplate().queryForObject("findAllMpsTestCount", null);
    }

    public ListResult pageAllMpsTest(int pagesize, int pageIndex) {
        ListResult listResult=new ListResult();
        listResult.setResult(findAllMpsTest(pagesize,pageIndex));
        listResult.setCount(findAllMpsTestCount());
        return listResult;
    }

   
public MpsTest saveMpsTest(MpsTest mpsTest) {
        getSqlMapClientTemplate().insert("saveMpsTest",mpsTest);
        return mpsTest;
    }


    public Long findMpsTestNextSeq() {
        return (Long) getSqlMapClientTemplate().queryForObject("findMpsTestNextSeq", null);
    }

}

 

六 实体bean代码(MpsTest)

package com.skywin.workorder.model;

import java.io.Serializable;
import java.util.Date;

/**测试记录*/
public class MpsTest implements Serializable{
   
   
/**主键*/
    private Long testId;
   
    /**关联工单*/
    private MpsWorkOrder mpsWorkOrder;
   
    /**工作流id*/
    private Long wfid;
   
    /**测试人*/
    private String testPerson;
   
    /**测试是否通过*/
    private int testResult;
   
    /**测试结果描述*/
    private String testDesc;
   
    /**测试日期*/
    private Date testDate;


    public MpsWorkOrder getMpsWorkOrder() {
        return mpsWorkOrder;
    }

    public void setMpsWorkOrder(MpsWorkOrder mpsWorkOrder) {
        this.mpsWorkOrder = mpsWorkOrder;
    }

   

    public String getTestDesc() {
        return testDesc;
    }

    public void setTestDesc(String testDesc) {
        this.testDesc = testDesc;
    }

    public String getTestPerson() {
        return testPerson;
    }

    public void setTestPerson(String testPerson) {
        this.testPerson = testPerson;
    }

    public int getTestResult() {
        return testResult;
    }

    public void setTestResult(int testResult) {
        this.testResult = testResult;
    }

    public Date getTestDate() {
        return testDate;
    }

    public void setTestDate(Date testDate) {
        this.testDate = testDate;
    }

    public Long getTestId() {
        return testId;
    }

    public void setTestId(Long testId) {
        this.testId = testId;
    }

    public Long getWfid() {
        return wfid;
    }

    public void setWfid(Long wfid) {
        this.wfid = wfid;
    }
   
   

}

 

 

七 建立一个jUnit测试类 测试第六步中dao的方法 其实改类本质上也是一个java类 要想成功的测试某个方法则方法名字不以test开头 代码如下 :

 

 

package com.skywin.workorder.dao;

import java.util.Date;
import java.util.List;

import com.skywin.workorder.model.MpsTest;
import com.skywin.workorder.model.MpsWorkOrder;
import com.skywin.workorder.util.ListResult;

public class MpsTestDaoTest extends AbstractTestCase
{
    MpsTestDao dao;
    public MpsTestDaoTest(){
        super();
       
dao=(MpsTestDao) ctx.getBean("woTestDao");
        System.out.println("dao"+dao);
       

    }
   
  
  public void  testsaveMpsTest(){
        System.out.println("go go go");
      
  MpsTest t=new MpsTest();
   
        t.setTestId(new Long(-105));
        t.setWfid(new Long(-15));
        System.out.println("2222222");
    MpsWorkOrder mpsWorkOrder=new MpsWorkOrder();
        mpsWorkOrder.setOrderId(new Long(-20));
        t.setMpsWorkOrder(mpsWorkOrder);
       
        t.setTestResult(-50);
        t.setTestPerson("kkkkk");
        t.setTestDesc("hao hao");
        t.setTestDate(new Date());
       
dao.saveMpsTest(t);
    }
   
    public void _testfindAllMpsTestCount(){
        Long c=dao.findAllMpsTestCount();
        System.out.println("c---"+c);
    }
   
    public void _testfindAllMpsTest(){
        List  list=dao.findAllMpsTest(3, 1);
        for(int i=0;i<list.size();i++){
            MpsTest t=(MpsTest) list.get(i);
            System.out.println(t.getTestId());
        }
        System.out.println(list);
    }
   
   
    public void _testpageAllMpsTest(){
        ListResult l=dao.pageAllMpsTest(3, 1);
        System.out.println(l.getCount());
    }
   
    public void _testfindMpsTestNextSeq(){
        Long s=dao.findMpsTestNextSeq();
       System.out.println("s---"+s);
    }
   
   
   
    public void test(){
        dao.deleteMpsTestById(new Long(-100));
    }
}

 

完成以上步骤后 运行JUnit就可以了,结果是红条还是绿条就看你dao实现类代码是否正确了

分享到:
评论

相关推荐

    maven+springmvc+spring+ibatis+velocity+mysql

    在构建企业级Web应用时,"maven+springmvc+spring+ibatis+velocity+mysql"这个组合提供了高效且灵活的开发框架。让我们逐一解析这些技术及其在项目中的作用。 **Maven** 是一个项目管理和综合工具,它帮助开发者...

    spring3+struts2+ibatis

    在现代企业级Web应用开发中,Spring、Struts2和Ibatis是常见的三大组件,它们各自负责不同的职责,共同构建出高效、灵活的应用架构。Spring作为全能型的框架,提供依赖注入(DI)和面向切面编程(AOP)等功能;...

    spring+ibatis demo搭建

    接下来,我们将在MyEclipse中创建一个新的Web工程,并命名为`SVI`。为了更好地组织代码,我们将按照MVC架构模式来规划项目的包结构。具体如下: - `com.sc.VSITest.dao`:存放DAO接口,负责定义数据访问的方法。 - ...

    struts+spring+ibatis实例

    Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们的组合应用在企业级Web应用开发中非常常见。Struts提供了MVC(Model-View-Controller)设计模式的实现,Spring作为全面的轻量级框架,管理着应用程序的...

    spring+ibatis的jpetstore实例工程,包含完整源代码和jar包

    总结,Spring+iBatis的JPetStore实例工程是一个生动的教学案例,它展示了如何利用这两个框架构建一个完整的Web应用。通过学习这个实例,开发者不仅可以深入了解Spring和iBatis的用法,还能掌握MVC架构、事务管理等...

    springMVC+spring+ibatis

    在 MyEclipse 中,可以将此项目导入为 Java Web 工程,设置 Tomcat 服务器,配置好项目的部署路径,最后运行项目,即可在浏览器中查看和测试整合后的功能。 总之,Spring MVC、Spring 和 iBATIS 的整合为 Java Web ...

    spring+webwork+ibatis

    标题“spring+webwork+ibatis”所提及的是一个集成框架,主要涵盖了Spring、WebWork和iBatis三个核心组件。这些技术都是在Java Web开发领域广泛应用的工具,特别是对于构建企业级应用有着显著的优势。 Spring是一个...

    spring+springmvc+ibatis整合小案例

    Spring、SpringMVC和iBatis是Java开发中常见的三个框架,它们的整合使用能构建出功能强大的Web应用。这个"spring+springmvc+ibatis整合小案例"旨在为初学者提供一个清晰的实践指导,帮助理解这三者如何协同工作。 ...

    spring2.5+ibatis3+web service cxf 例子MyEclipse工程

    标题 "spring2.5+ibatis3+web service cxf 例子MyEclipse工程" 提供了一个关于如何在MyEclipse环境中集成并使用Spring 2.5、iBatis 3和CXF Web服务的实例。这个项目组合是Java企业级开发中常见的技术栈,下面将详细...

    Velocity+Spring+Ibatis框架搭建说明文档1

    2. **新建工程**:使用 Myeclipse 创建一个新的 Web 工程,命名为 `SVI`,然后导入所需 jar 包,这些包应包括 Velocity、Spring 和 Ibatis 的相关依赖。 3. **配置 ibatis**:配置 `ibatis` 主要涉及到 `mybatis-...

    marven最简单Spring+struts2+ibatis例子工程代码

    在描述中提到的“探索POM文件如何编写”,意味着这个项目会展示如何正确配置POM.xml,以确保Spring、Struts2和iBatis这些库的正确引入和版本管理。 2. Spring框架: Spring是一个全面的Java企业级应用开发框架,...

    spring2.5.5+struts2+ibatis2.3.4

    根据提供的文件信息,我们可以深入探讨如何使用 Spring 2.5.5、Struts 2 和 iBatis 2.3.4 构建一个集成的 Java Web 应用程序。以下是对各个部分的关键知识点的详细解释: ### 一、框架搭建与依赖库 #### 1.1 框架...

    struts2+ibatis+spring完全整合

    Struts2、iBatis和Spring的整合是一个常见的企业级应用框架组合,它们各自负责不同的职责,协同工作以实现高效且灵活的Java Web应用程序。以下将详细解释这些知识点: 1. **Struts2**:Struts2是一个基于MVC设计...

    maven聚合web工程--struts2+spring

    "maven聚合web工程--struts2+spring"这个标题表明我们正在讨论一个使用Maven构建的项目,该项目集成了Struts2和Spring这两个流行的Java Web框架。Struts2是一个用于构建 MVC(模型-视图-控制器)架构的框架,而...

    Jquery+Spring3+Struts2+Ibatis3框架源代码工程(含权限)

    标题 "Jquery+Spring3+Struts2+Ibatis3框架源代码工程(含权限)" 涉及的是一个基于Web开发的经典技术栈,其中包括前端的JQuery库,后端的Spring MVC、Struts2框架以及持久层的Ibatis3。这个项目提供了完整的源代码,...

    struts2+ibatis+spring整合开发

    Struts2、iBatis和Spring的整合是Java Web开发中常见的技术栈组合,它们各自负责不同的职责,共同构建一个高效、灵活的应用框架。在这个整合过程中,Struts2作为前端控制器,负责处理用户请求和视图展示;iBatis作为...

    spring\ibatis样例工程

    【标题】"spring\ibatis样例工程"揭示了这个压缩包内容是一个基于Spring和iBatis框架的示例Web MVC项目。这个项目是为学习和理解如何在实际开发环境中集成和使用这两个流行的技术而创建的。Spring是一个全面的Java...

Global site tag (gtag.js) - Google Analytics