锁定老帖子 主题:测试配置为连接数据源单独的jar
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-31
最后修改:2009-08-31
问题描述
以前我们做的项目基于未来适应多项目的要求进行了产品/ 项目的分拆,项目可以重复利用产品的产出。这 样就需要对代码进行分离,分离后产品对外提供的接口暂时包括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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 983 次