Mockito简单语法使⽤
使⽤类库需要在中加⼊mockito依赖配置:
testCompile'o:mockito-core:2.8.9'
Mock的概念:
所谓的mock就是创建⼀个类的虚假的对象,在测试环境中,⽤来替换掉真实的对象,以达到两⼤⽬的:
1.验证这个对象的某些⽅法的调⽤情况,调⽤了多少次,参数是什么等等
2.指定这个对象的某些⽅法的⾏为,返回特定的值,或者是执⾏特定的动作
上⾯说了Mock的概念,下⾯开始搬砖,写段代码⽰例来说明Mockito的⼀些常⽤语法使⽤,代码如下:
/************************************************************
*Author:ssc
*Date:2018/7/20
*Version:1.0
*Description:⼈的逻辑判断层
*History:
*
***********************************************************/
publicclassPerson{
/**
*获取该类型性别并进⾏打印
*
*@paramtype0代表⼥⽣、1代表男⽣、其他数字提⽰参数有误
*/
publicvoidgetSex(inttype){
if(type==0){
printing("⼥");
}elif(type==1){
printing("男");
}el{
printing("参数有误");
}
}
/**
*打印⽅法
*
*@paramcontent
*/
publicvoidprinting(Stringcontent){
//这⾥为了简单我们直接控制台输出
(content);
}
/**
*判断类型是否是男⼈
*
*@paramtype
*@return
*/
publicbooleanisMan(inttype){
//处理逻辑这⾥为了⽅便我们直接进⾏简单判断
returntype==1;
}
}
1.如何mock出⼀个虚假的对象:
Personperson=();
2.如何验证⽅法调没调⽤
(person).getSex(...);这句话的作⽤是,验证person的getSex得到了调⽤,调⽤次数为1次。因为这⾏代码其实是:
(person,(1)).getSex(...)的简写,或者说重载⽅法,注意其中的(1)。因此,如果你想验证⼀个对
象的某个⽅法得到了多次调⽤,只需要将次数传给()就好了。
(person,(3)).getSex(...);//验证person的⽅法getSex(...)得到了三次调⽤。
2.1验证⽅法的调⽤次数⽅法有:
times(n):⽅法被调⽤n次
never():没有被调⽤
atLeast(n):⾄少被调⽤n次
atLeastOnce():⾄少被调⽤1次,相当于atLeast(1)
atMost():最多被调⽤n次
代码演⽰:
//执⾏1次
verify(person,times(1)).add(...);
//执⾏2次
verify(person,times(2)).add(...);
verify(person,times(3)).add(...);
//从不执⾏,never()等同于times(0)
verify(person,never()).add(...);
//验证⾄少执⾏1次
verify(person,atLeastOnce()).add(...);
//验证⾄少执⾏2次
verify(person,atLeast(2)).add(...);
//验证最多执⾏4次
verify(person,atMost(4)).add(...);
3.在不关⼼参数为什么值的情况下,如何通过Mock的语法给出⽅法所需要的参数对应类型
⽐如上⾯的例⼦,我们在调⽤性别后,会⾛打印⽅法,这是我们只关⼼打印⽅法⾛没⾛,⽽不关⼼他的参数是什么的时候,我们就要⽤到Mock的
any⽅法。代码如下:
(person).printing(ing());
anyString()表⽰任何⼀个字符串都可以。下⾯我列举⼀些常⽤的参数适配⽅法
3.1参数适配⽅法
anyString
anyInt
anyLong
anyDouble
anyObject表⽰任何对象
any(clazz)表⽰任何属于clazz的对象
anyCollection
anyCollectionOf(clazz)
anyList(Map,t)
anyListOf(clazz)等等
4.指定某个⽅法的返回值,或者是执⾏特定的动作。
4.1指定某个⽅法的返回值
(Method(args)).thenReturn(desiredReturnValue);
该⽅法是执⾏Method()使其返回特定的值desiredReturnValue,据需⽤我们的person来举例:
//当调⽤person的isMan⽅法,同时传⼊"0"时,返回true
(注意这个时候我们调⽤(0);的时候值为true⽽调⽤其他数字则为fal,
如果我们忽略数字,传任何值都返回true时,就可以⽤到我们上⾯讲的any()参数适配⽅法)
((0)).thenReturn(true);
//当调⽤person的isMan⽅法,同时传⼊"0"时,返回fal(注意同上⾯解释⼀样)
((0)).thenReturn(fal);
相关语法
doThrow(Throwable...):进⾏异常测试
@Test
publicvoidtestMock(){
Listlist=mock();
("123");
//当list调⽤clear()⽅法时会抛出异常
doThrow(newRuntimeException()).when(list).clear();
();
}
doReturn():指定返回值
@Test
publicvoidtestMock(){
Listlist=mock();
doReturn("123").when(list).get(anyInt());
n((0));
}
doNothing():指定void⽅法什么都不做
doCallRealMethod():指定⽅法调⽤内部的真实逻辑
classFoo{
publicvoiddoFoo(){
n("methoddoFoocalled.");
}
publicintgetCount(){
return1;
}
}
@Test
publicvoidtestMock(){
Foofoo=mock();
//什么信息也不会打印,mock对象并不会调⽤真实逻辑
();
//啥也不会打印出来
doNothing().when(foo).doFoo();
();
doCallRealMethod().when(foo).doFoo();
//这⾥会调⽤真实逻辑,打印出"methoddoFoocalled."信息
();
//这⾥会打印出0
n(nt());
doCallRealMethod().when(foo).getCount();
//这⾥会打印出"1"
n(nt());
}
4.2执⾏特定的动作
在安装中经常⽤到⽹络请求数据,⽽我们在测试时忽略⽹络请求这块时,就可以⽤到mock的执⾏特定的动作:
er(desiredAnswer).when(mockObject).targetMethod(args);
传给doAnswer()的是⼀个Answer对象,我们想要执⾏什么样的动作,就在这⾥⾯实现。如:
//登录操作:
/**
*⽹络请求返回
*/
publicinterfaceNetCallback{
voidonSuccess(Objectdata);
voidonFailure(intcode,Stringmsg);
}
/**
*⽹络请求
*Createdbyxiaochuangon4/25/16.
*/
publicclassApi{
publicvoidget(Stringurl,Map
//⽹络请求处理操作逻辑,这块忽略写法
//成功调⽤ess(data);
//失败调⽤ure(code,msg);
}
}
----------------------------------------------------------------------分割线上⾯是⽹络请求,下⾯是doAnswer的使⽤⽅法
Apiapi=mock();
er(newAnswer(){
@Override
publicObjectanswer(InvocationOnMockinvocation)throwsThrowable{
//这⾥可以获得传给performLogin的参数
Object[]arguments=uments();
//callback是第三个参数下标是2
NetworkCallbackcallback=(NetworkCallback)arguments[2];
ure(500,"Servererror");
return500;
}
}).when(api).get(anyString(),any(),any());
//这时我们调⽤()⽅法
("",null,newNetworkCallback(){
@Override
publicvoidonSuccess(Objectdata){
}
@Override
publicvoidonFailure(intcode,Stringmsg){
(msg);
}
});
//控制台输出Servererror。这样我们在测试时,可以忽略⽹络请求,然后直接判断请求后的操作
有了mock可以使我们的单元测试更加⽅便便捷。
本文发布于:2022-11-12 14:46:34,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/4932.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |