mock测试

上一篇 / 下一篇  2013-08-31 09:59:30 / 个人分类:测试

手贱点击了一下【可用tag】日志被清空了,郁闷ing。。。。。重新再写吧。
接口测试中,很多情况是被测接口调用了其他服务的接口,这个时候我们编写的测试脚本有面临几个困难,第一,外部服务不稳定时,我们的脚本会受影响;第二,我们需要准备各种真实的测试数据去测试被测代码的各种逻辑,这个比较坑爹。第三,准备的测试数据,可能执行了一次之后不可再用,脚本不能进行每日回归。面对这些困难,强大的测试工程师找到了一种叫mock测试的方法。
下面就主要介绍一下mock测试方法吧,据我所知,mock方法有两种,一种是copy开发代码,然后将外部服务的接口去掉,指定特定的返回值,测试脚本指定到当前copy的类进行测试,这个方法有几个不好的地方,其一,被测对象有改动,测试copy的类必须同步改动,否则测试脚本不是针对线上运行的代码进行测试,失去了脚本的意义;其二,mock的外部服务返回值有多种情况的时候,copy的类不是很好写。另一种是直接mock外部服务的接口,使用mock工具。本人比较喜欢第二种mock方法。
下面重点介绍一下第二种方法:我使用的工具是mockito。
首先需要在pom文件里面加上mockito的依赖,比如:<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
然后根据被测代码创建mock方法,先看一下被测代码:
@Slf4j
public class CheckNormalShop extends ShopCenterLogicNode {

@Override
public RhineServiceResult<String> excute(Map<String, Object> map) {
Long memberId = RhineServiceParamsUtils.getMemberId(map);
RhineServiceResult<String> result = new RhineServiceResult<String>();
if (null == memberId) {
result.setSuccess(false);
result.setErrorMsg("传入的memberid为空或者不合法");
result.setResultObject(BizResultConstants.FALSE_RESULT_OBJECT);
return result;
}
try {
boolean hasNormalShop = shopCenterManager
.checkHasNormalShopByMemberId(memberId);
result.setSuccess(true);
if (hasNormalShop) {
result.setResultObject(BizResultConstants.TRUE_RESULT_OBJECT);
} else {
result.setResultObject(BizResultConstants.FALSE_RESULT_OBJECT);
}
return result;
} catch (ManagerException e) {
result.setSuccess(false);
result.setErrorMsg("查询cs接口失败 memberId " + memberId);
result.setResultObject(BizResultConstants.FALSE_RESULT_OBJECT);
log.error("调用CS接口失败 with " + memberId );
return result;
}
}
找到需要mock的外部服务方法是:shopCenterManager.checkHasNormalShopByMemberId(memberId);
然后需要写一个mock方法,代码如下:
private void mockshopCenterManager(Long memberId,boolean re ){
ShopCenterManager shopCenterManager = mock(ShopCenterManager.class);//需要mock的外部接口类,进行mock类实例化
try {
when(shopCenterManager.checkHasNormalShopByMemberId(memberId)).thenReturn(re);//调用该接口的这个方法时,返回值就是当前的re
} catch (ManagerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
checkHasNormalShop.setShopCenterManager(shopCenterManager);//在被测类中set回去当前的外部接口类,说明被测对象使用了mock的类
}
测试脚本只需要在调用被测对象之前执行下mock方法就ok了,具体代码如下:
@Test
public void test07_memberIdHasShop() throws ManagerException, ShopServiceException{
ShopDO shopDO=new ShopDO();
shopDO.setApproveStatus(1);
Long memberId=123L;
boolean re=true;
Map<String, Object> map=new HashMap<String, Object>();
map.put("memberId",memberId);
QueryShopDO query = new QueryShopDO();
query.setUserIDNum(memberId);
mockshopCenterManager(memberId,re);
RhineServiceResult<String> result=checkHasNormalShop.excute(map);
Assert.assertEquals(true, result.isSuccess());
Assert.assertEquals("逻辑节点执行的返回值",BizResultConstants.TRUE_RESULT_OBJECT, result.getResultObject());
}
这个mock就实现了,其中相较于第一种方法,有两个好处,第一不需要copy开发代码,第二返回值可以随着脚本的不同构造不同的返回值。
当前mock工具有很多,我只是目前学习到了这个方法,等以后学习到更多的mock方法,再在这边记录下来。

TAG:

 

评分:0

我来说两句

Open Toolbar