前言
本计划在上周六日将powermock学完,并同步到博客中,结果自己没经得住诱惑,又开始去打王者荣耀了。虽然两天时间我从钻石一升到了星耀V四星,但是我并没有觉得很开心,相反很失落呢。不得不说腾讯的游戏做的用户粘度真高,厉害的狠。
言归正传,周一上班后开始收拾心情,接着我每天的学习之路,本应该昨天更新文章的有一处代码一直报错未解决,卡了很久,直到今天才解决,就像丝瓜妹说的,学习其实一直是闭门造车。。。我太难了。。。。。
关于Argument Matcher
从英文字面理解,就是说的是参数匹配相关的事,也就是在mock中,这块主要是为了处理方法间调用传入的不同参数,返回不同内容使用的。
模拟场景
很简单,模拟输入用户名查找电话号码,即使用controller调用service服务
代码实现
service部分
具体示例代码如下:
package com.rongrong.powermock.matcher;
/**
* @author rongrong
* @version 1.0
* @description:
* @date 2019/12/3 21:02
*/
public class StundentMatcherService {
public String getPhoneNum(String userName) {
throw new UnsupportedOperationException();
}
}
controller部分
具体示例代码如下:
package com.rongrong.powermock.matcher;
/**
* @description:controller调用service
* @author rongrong
* @version 1.0
* @date 2019/12/3 20:55
*/
public class StudentController {
public String getPhoneNum(String userName){
StundentMatcherService stundentMatcherService = new StundentMatcherService();
return stundentMatcherService.getPhoneNum(userName);
}
}
因为存在局部变量,肯定使用powermock来测试,使用之前学过的办法测试,具体示例代码如下:
package com.rongrong.powermock.matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static junit.framework.TestCase.assertEquals;
/**
* @description:之前学过的方法测试
* @author rongrong
* @version 1.0
* @date 2019/12/3 21:10
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentController.class)
public class TestStudentMatcher {
@Test
public void testStudentMatcher(){
StundentMatcherService stundentMatcherService = PowerMockito.mock(StundentMatcherService.class);
PowerMockito.when(stundentMatcherService.getPhoneNum("xiaoqiang")).thenReturn("15111111111");
try {
PowerMockito.whenNew(StundentMatcherService.class).withAnyArguments().thenReturn(stundentMatcherService);
StudentController studentController = new StudentController();
String phoneNum = studentController.getPhoneNum("xiaoqiang");
assertEquals("15111111111",phoneNum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
细心的同学,可能会发现,我这块只录制了查询用户名xiaoqiang,然后返回一个电话号码,那比如我想查alex,Tom,xiaoming,tony等等这些同学的电话号,是不是都需要加入以下代码:
PowerMockito.when(stundentMatcherService.getPhoneNum("alex")).thenReturn("15111111111");
PowerMockito.when(stundentMatcherService.getPhoneNum("Tom")).thenReturn("15111111111");
PowerMockito.when(stundentMatcherService.getPhoneNum("xiaoming")).thenReturn("15111111111");
PowerMockito.when(stundentMatcherService.getPhoneNum("tony")).thenReturn("15111111111");
如果没加则返回null,难道我们需要手动去添加,代码上看肯定是冗余的,那么怎么办呢,我们采用mock中的 Argument Matcher来进行测试。
具体代码如下:
package com.rongrong.powermock.matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.fail;
/**
* @author rongrong
* @version 1.0
* @description:
* @date 2019/12/3 21:23
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentController.class)
public class TestStudentMatcherWithArgMather {
@Test
public void testStudentMatcherWithArgMather(){
StundentMatcherService stundentMatcherService = PowerMockito.mock(StundentMatcherService.class);
PowerMockito.when(stundentMatcherService.getPhoneNum(Mockito.argThat(new ArgumentMatcher() {
@Override
public boolean matches(Object argument) {
String arg=(String)argument;
if(arg.startsWith("rr")||arg.contains("rongrong"))
return true;
else
return false;
//使用运行时异常也可,只是使用后看不到,匹配不到情况返回值效果
//throw new RuntimeException();
}
}))).thenReturn("010-888888888");
try {
PowerMockito.whenNew(StundentMatcherService.class).withAnyArguments().thenReturn(stundentMatcherService);
StudentController studentController = new StudentController();
//验证存在的时候,返回匹配结果
String phoneNum = studentController.getPhoneNum("rr");
assertEquals("010-888888888",phoneNum);
//验证不存在的时候,返回null
phoneNum = studentController.getPhoneNum("jiuqujian");
assertEquals("010-888888888",phoneNum);
} catch (Exception e) {
fail("test fail!!!");
}
}
}
通过实现一个匿名 ArgumentMatcher 类,实现了根据不同参数获得不同的返回结果预期,这样我们就可以少写一些录制行为的过程了(when...thenReturn)。
PowerMock学习之PoweMock的入门(二)
前言 在上一篇文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...
Python Tutorial 学习(八)--Errors and Exceptions
Python Tutorial 学习(八)--Errors and Exceptions恢复 Errors and Exceptions 错误与异常 此前,我们还没有开始着眼于错误信息.不过如果你是一 ...
SVG 学习<;八>; SVG的路径——path(2)贝塞尔曲线命令、光滑贝塞尔曲线命令
目录 SVG 学习基础图形及线段 SVG 学习进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习渐变 SVG 学习
PowerMock学习(一)之PoweMock的入门--模拟新增学生操作
关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...
PowerMock学习(六)之Mock Final的使用
Mock Final mockfinal相对来说就比较简单了,使用powermock来测试使用final修饰的method或class,比较简单,接口调用部分,还是service调用dao. 对于接口 ...
PowerMock学习(九)之Mock Answer的使用
关于Mock Answer 上一篇文章,有介绍过关于Arguments Matche的使用,其实 Answer的作用与其比较类似,但是它比 Arguments Matcher 更加强大. Argume ...
PowerMock学习(十一)之Mock private methods的使用
Mock private methods 就是mock私有方法啦,学到这不难发现,我们其实大部分都是通过反射去完成单元测试的,但是在实际中,某个类中的私有方法,个人不建议使用反射来测试,因为有时候会 ...
PowerMock学习(三)之Mock局部变量
编写powermock用例步骤: 类上面先写这两个注解@RunWith(PowerMockRunner.class).@PrepareForTest(StudentService.class) 先模拟 ...
随机推荐
Android 如何判断一个应用在运行(转)
Android 如何判断一个应用在运行 在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...
在WebApi中实现Cors访问
Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...
使用Expression做Linq的參數化排序
Linq非常的好用,減少大量的資料庫操作手序,使用具名的類別,減少了在程式中寫SQL寫錯字的可能性,問題來了,如果我想用QueryString中的參數,作為排序的依據,但是因為是具名的類別,不能指定字 ...
图片缩放时java.lang.IllegalArgumentException: pointerIndex out of range解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. 06-03 20:45:24.143: E/AndroidRuntime(1230): FATAL EXCEPTION: main06-03 20 ...
navigator,JS检测浏览器插件
最早由Netscape Navigator 2.0引入的navigator对象,现在已经成为识别客户端浏览器的事实标准.虽然其它浏览器也通过其它方式提供了相同或相似的信息(例如,IE中的window. ...
str_repeat() 函数把字符串重复指定的次数。
str_repeat() 函数把字符串重复指定的次数. str_repeat(string,repeat) 参数 描述 string 必需.规定要重复的字符串. repeat 必需.规定字符串将被重复 ...
ECMAScript 6 之 let 和 const 命令
1.let基本用法 1.1.声明变量 let声明的变量只在它所在的代码块有效. 1.2.不存在变量提升 var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined: let命令 ...
SSAS 内部错误:操作未能成功
错误 -1056964601 : 内部错误: 操作未能成功,已终止. HY0008 是数据源的问题,设置数据源的虚拟连接就可以了
黑盒测试用例设计——PICT(QQ实践)
以QQ的状态设置来做一次实践.QQ用户可以对如下的状态方面的设置.后两张图是登录后的状态的可选项和鼠标键盘无动作后将状态切换至的可选项.默认的自动回复有三种,默认的快捷回复有四种.对于自动回复和快捷 ...
Redis学习篇(十二)之管道技术
通过管道技术降低往返时延 当后一条命令不依赖于前一条命令的返回结果时,可以使用管道技术将多条命令一起 发送给redis服务器,服务器执行结束之后,一起返回结果,降低了通信频度.