dubbo免配置单元测试

2020-11-19 14:38:58 浏览数 (1)

代码语言:javascript复制
对于一个严谨的程序员,
我们每开发一个程序,
理论上都要经过单元测试的,
经过单元测试我们可以发现
比较简单的,低级的逻辑性错误,
和sql语句错误等问题,
如果这些错误异常在测试阶段
或者说生产环境出现,
那么说明一个问题,我们的程序
真的不够严谨,所以说单元测试
是一个合格或者说优秀的开发
人员必须具备的
一项技能。此篇不对单元测试
做太多赘述,重点讲述一下
dubbo服务化后我们怎样
简单有效的做好单元测试
代码语言:javascript复制
dubbo单元测试大概分两种,
1.基于配置;
2.免配置。
相信各位使用过dubbo的看官
对基于配置的单元测试都有
所了解,接下来介绍一下免配置
的dubbo单元测试案例
(点到点直连和基于配置中心)
一、点到点直连方式
代码语言:javascript复制
在maven项目src/test目录下
建立单元测试基类,如下:

123456789101112131415161718192021222324252627282930

/*** 免配置dubbo服务单元测试** @author Typhoon* @date 2017-08-03 17:35 Thursday* @since V1.3.1* @param <T>*/public abstract class BaseTest1<T> { private ApplicationConfig application = null;private Class <T> clazz = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];private static final String dubboUrl = "dubbo://10.1.8.76:10189";private static final String appName = "zhenai-crm-center-test";public BaseTest1() {application = new ApplicationConfig();application.setName(appName);}T getService() {// 引用远程服务ReferenceConfig<T> reference = new ReferenceConfig<T>();// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏reference.setApplication(application);//reference.setRegistry(registry); // 多个注册中心可以用setRegistries()reference.setUrl(dubboUrl);reference.setInterface(clazz);reference.setTimeout(30000);// 和本地bean一样使用xxxServicereturn reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用};}

代码语言:javascript复制
讲述一下几个含义,
Application:我们每一个服务
都需要依托于某个应用模块的,
Clazz<T>:根据子类实现获取
泛型类class类型,
dubboUrl:消费端需要直连
的服务提供方,appName:当前
应用名称。重点是getService
方法,直接将rpc服务本地化
供本地服务调用,
ReferenceConfig<T>:服务引用,
等价于配置文件中
<dubbo:reference/>节点,
设置一坨的Application,
直连的服务地址,
具体的服务接口,超时时间
代码语言:javascript复制
根据要测试的接口写
具体单元测试类:

123456789

public class ComplaintInfoServiceTest1 extends BaseTest1<ComplaintInfoService> {private static final Logger LOGGER = LoggerFactory.getLogger(ComplaintInfoServiceTest1.class);ComplaintInfoService complaintInfoService = this.getService();@Testpublic void testQueryByPK() {ComplaintInfoDto dto = complaintInfoService.queryByPK(1L);LOGGER.info("响应:{}",JSON.toJSONString(dto));}}

代码语言:javascript复制
重点是第二行,this.getService()
直接返回ComplaintInfoService
接口服务实例,
然后就可以向本地服务一样写
单元测试,效果如下:
二、基于注册中心方式
代码语言:javascript复制
配置中心使用的是zookeeper,
我们需要对方式一的基类
做改造如下:

1234567891011121314151617181920212223242526272829303132333435

/*** 免配置dubbo服务单元测试** @author Typhoon* @date 2017-08-03 17:35 Thursday* @since V1.3.1* @param <T>*/public abstract class BaseTest1<T> {private ApplicationConfig application = null;private RegistryConfig registry = null;private Class <T> clazz = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];private static final String zkUrl = "t.zk01.jiebao.zhenai.com:6681,t.zk02.jiebao.zhenai.com:6682,t.zk03.jiebao.zhenai.com:6683";private static final String appName = "zhenai-crm-center-test";public BaseTest1() {application = new ApplicationConfig();application.setName(appName);// 连接注册中心配置registry = new RegistryConfig();registry.setProtocol("zookeeper");registry.setAddress(zkUrl);// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接}T getService() {// 引用远程服务ReferenceConfig<T> reference = new ReferenceConfig<T>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏reference.setApplication(application);reference.setRegistry(registry); // 多个注册中心可以用setRegistries()//reference.setUrl(dubboUrl);reference.setInterface(clazz);reference.setTimeout(30000);// 和本地bean一样使用xxxServicereturn reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用};}

代码语言:javascript复制
和方式一相比,该基类多了
RegistryConfig,等价于
<dubbo:registry/>节点,
zkUrl就是要配置的zk路径
(多个之间用逗号隔开),
getService方法不在使用
直连的方式,这是了注册
中心后会去配置中心找服务.
代码语言:javascript复制
    接下来是基于注册
    中心的单元测试类

123456789

public class ComplaintInfoServiceTest1 extends BaseTest1<ComplaintInfoService> {private static final Logger LOGGER = LoggerFactory.getLogger(ComplaintInfoServiceTest1.class);ComplaintInfoService complaintInfoService = this.getService();@Testpublic void testQueryByPK() {ComplaintInfoDto dto = complaintInfoService.queryByPK(1L);LOGGER.info("响应:{}",JSON.toJSONString(dto));}}

代码语言:javascript复制
然后就可以向本地服务一样
写单元测试,效果如下:
代码语言:javascript复制
其实我们根据真实业务场景分析,
第二种是不太适用的,因为我们
要测得基本上都是自己写的
dubbo服务,所以基本上都是
适用点点之间直连的方式,
而如果适用注册中心的花,
有可能我们单元测试调用
的服务是别人注册上去的
或者是测试环境机器上的服务,
然后就出现自己写单元
测试测别人服务。
所以我们本地开发过程中
都是适用第一种方式

ps:以上两种方式在服务正常

的情况下都能调用成功得到

正确的响应结果,如果能帮到

各位看官,是我的荣幸, 如果觉得我写的不够好,

请把板砖扔过来并提出宝贵意见

0 人点赞