测试配置为连接数据源单独的jar
问题描述
以前我们做的项目基于未来适应多项目的要求进行了产品/ 项目的分拆,项目可以重复利用产品的产出。这 样就需要对代码进行分离,分离后产品对外提供的接口暂时包括EJB 接口、SOAP 接口、JMS 接口以及直接的jar 提供。前三种方式在独立的产品环境很容 易进行功能测试,但是对于直接提供的jar 中代码如何测试呢?jar 中包括service (基于spring 和独立的)、dao (ibatis )等逻辑, 讨厌的是ibatis 中连接配置的是weblogic 的datasource ,因为采用的这种方式,单元测试和功能测试都很麻烦,单元测试需要修改连接数据库的方式;功能测试,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 ,但是这样又跟我们已经存在的 war 、ear 中的jar 产生冲突,因此决定将产出的独立jar 结合其依赖的jar 以及利用hessian 做成一个独立的war ,发布后,写client 进行测试。
优点:可以进行测试,覆盖率可以统计到,没有影响最终产出,没有影响任何已存在的代码,包括svn 中的原代码。
缺点:额外的增加了一个测试war 的工作量。
最后,我们选择了方案2 ,原因是不影响已经存在的东西,而且新的方案实施起来也很简单。
下面是方案2 的实施细节:
对于单独的不依赖spring 的service ,仅通过new XXXService 就可以执行的接口,只需要做如下配置即可,在测试war 的web.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"); }
对 于依赖spring 的service ,原先我们就有singleton 的ServiceFactory 进行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
阅读更多- Tomcat 配置的数据源,测试连接数据库报告类转换错误
- [UnixODBC]UnixODBC配置数据源-isql测试成功,但程序连接失败
- java连接数据源-读取tomcat数据源配置
- linux系统Amoeba+MySL主从读写分离配置 javaweb项目配置连接数据源
- oracle远程连接配置,用PL SQL测试也可以
- 分析共享Spring配置数据源四种方式(附相应jar包)
- php连接mysql测试和配置
- mysql数据库连接数据源配置
- 数据源连接测试详解
- Form中单独使用query过滤数据源表连接
- NAT连接虚拟机和主机的通信(静态IP配置完整图解,测试通过可用)--结束篇
- 深入Hibernate的配置文件---5.4.5: JNDI 数据源的连接属性
- mongodb在Windows安装配置及遇到的问题、java连接测试
- php连接mysql测试和配置
- weblogic11配置数据源连接时报cannot load driver:com.ibm.db2.jcc.DB2Driver
- php连接mysql测试和配置
- 简单调用VS自带的数据源选择对话框实现数据库连接字符串配置
- Jboss 服务器 JNDI 配置数据源连接数据库
- Eclipse连接Hadoop2.7.3集群配置及测试
- Oracle Net Manager配置本地数据库连接,测试时卡死解决方法之一