论坛首页 Java企业应用论坛

测试配置为连接数据源单独的jar

浏览 978 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-31   最后修改:2009-08-31

问题描述

 

以前我们做的项目基于未来适应多项目的要求进行了产品/ 项目的分拆,项目可以重复利用产品的产出。这 样就需要对代码进行分离,分离后产品对外提供的接口暂时包括EJB 接口、SOAP 接口、JMS 接口以及直接的jar 提供。前三种方式在独立的产品环境很容 易进行功能测试,但是对于直接提供的jar 中代码如何测试呢?jar 中包括service (基于spring 和独立的)、daoibatis )等逻辑, 讨厌的是ibatis 中连接配置的是weblogicdatasource ,因为采用的这种方式,单元测试和功能测试都很麻烦,单元测试需要修改连接数据库的方式;功能测试,jar 又没有暴露任何对外接口,要测试它怎么办?

 

背景

 

1 。无论是单元测试还是功能测试都是我们CI 环境的一部分,因此需要统计其覆盖率。

2 。无论什么测试,都不能影响最终产出的jar 文件(不增不减代码)。

3 。所有的service 层都分为接口和实现。

 

解决方案(临时)

 

1 。做单元测试

   ibatis 的连接数据库的方式改为直接连,而不通过datasource ,而在测试完毕后通过ant 脚本将连接方式改为datasource 连接。

 

    优点:可以进行测试,覆盖率可以统计到,没有影响最终产出。

    缺点:SVN 中存在的ibatis 的配置文件是错误的,需要通过ant 进行修改,增加了复杂性。

 

2 。做功能测试

    如果jar 中代码对其他第三方jar 没有依赖,可以直接在weblogic 启动时中加载这个jar ,然后通过Hessian 来暴露这些service ,然后写client 进行测试。

    我们的jar 要依赖很多第三方jar ,如果通过上面的方式,会在启动时加载jar 时报错,除非在启动时也加载这些依赖jar ,但是这样又跟我们已经存在的 warear 中的jar 产生冲突,因此决定将产出的独立jar 结合其依赖的jar 以及利用hessian 做成一个独立的war ,发布后,写client 进行测试。

 

    优点:可以进行测试,覆盖率可以统计到,没有影响最终产出,没有影响任何已存在的代码,包括svn 中的原代码。

    缺点:额外的增加了一个测试war 的工作量。

 

最后,我们选择了方案2 ,原因是不影响已经存在的东西,而且新的方案实施起来也很简单。

 

下面是方案2 的实施细节:

 

对于单独的不依赖springservice ,仅通过new XXXService 就可以执行的接口,只需要做如下配置即可,在测试warweb.xml 中:

   

<servlet>
        <servlet-name>axisService</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
            <param-name>home-class</param-name>
            <param-value>com.bitfone.smartdm.facade.service.impl.CCManagementServices</param-value>
        </init-param>
        <init-param>
            <param-name>home-api</param-name>
            <param-value>com.bitfone.smartdm.facade.service.ICCManagementServices</param-value>
        </init-param>
    </servlet>   

    <servlet-mapping>
        <servlet-name>axisService</servlet-name>
        <url-pattern>/axisService</url-pattern>       
    </servlet-mapping>
 

 

war 发布后,如下测试

   

public void testGetAllValidReleasedUpdatePackageById() throws Exception{
        String url = "http://16.158.48.31:8001/odtest/axisService";

        HessianProxyFactory factory = new HessianProxyFactory();
        ICCManagementServices cc = (ICCManagementServices) factory.create(ICCManagementServices.class, url);


        String ap = cc.getAllValidReleasedUpdatePackageById(10001);
       
        assertEquals(ap, "10001");
    }
 

 

对 于依赖springservice ,原先我们就有singletonServiceFactory 进行spring 配置的加载以及bean 的获取,因 此在war 中增加一个service 接口和实现,对于原service 的方法进行代理。(增加的service 接口和实现是在测试的war 中, 而不是原有的代码中)。

增加的接口和实现如下:

public interface IOdomainService {

   public String getGroupNameById(String groupId);
}
 


import com.bitfone.smartdm.facade.service.IBulkServices;
import com.bitfone.smartdm.facade.util.ServiceFactory;
import com.bitfone.smartdm.odomain.test.service.IOdomainService; 

public class OdomainService implements IOdomainService { 

    public String getGroupNameById(String groupId){
       IBulkServices bs = (IBulkServices)ServiceFactory.getInstance().getService(IBulkServices.class); 

        String groupName = bs.getGroupNameById(groupId);      

        return groupName;

    }

}
 

 

 

然后进行如下web.xml 配置

   

<servlet>
        <servlet-name>odomainService</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
            <param-name>home-class</param-name>
            <param-value>com.bitfone.smartdm.odomain.test.service.impl.OdomainService</param-value>
        </init-param>
        <init-param>
            <param-name>home-api</param-name>
            <param-value>com.bitfone.smartdm.odomain.test.service.IOdomainService</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>odomainService</servlet-name>
        <url-pattern>/odomainService</url-pattern>       
    </servlet-mapping>
 

 

最后测试代码如下

   

public void testGetGroupNameById() throws Exception{
        String url = "http://16.158.48.31:8001/odtest/odomainService";

        HessianProxyFactory factory = new HessianProxyFactory();
        IOdomainService os = (IOdomainService) factory.create(IOdomainService.class, url);

        String groupName = os.getGroupNameById("42287");
       
        assertNotNull(groupName);
       
        assertEquals(groupName, "go2");
    }
 

 

更好的解决方案,期待您的share

 

参考http://hessian.caucho.com/#Documents

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics