PowerMock学习(八)之Mock Argument Matcher的使用
前言
本计划在上周六日将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<String>() {
@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!!!");
} }
}
PowerMock学习(八)之Mock Argument Matcher的使用的更多相关文章
- 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...
- PowerMock学习之PoweMock的入门(二)
前言 在上一篇<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 支持gRPC的Mock Server实现
PowerMock是一个Mock Server的实现,它同时支持HTTP与gRPC协议接口的Mock,并提供了灵活的插件功能. 这个工具面向于前后端.测试等对有接口Mock需求的开发人员,也可以作为一 ...
- 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私有方法啦,学到这不难发现,我们其实大部分都是通过反射去完成单元测试的,但是在实际中,某个类中的私有方法,个人不建议使用反射来测试,因为有时候会 ...
随机推荐
- 3年java开发竟然还不知道Lambda的这个坑
背景 有朋友反馈zk连接很慢.整理出zk连接的关键逻辑如下: 上面的代码造成第一次调用ClientZkAgent.getInstance的时候,需耗时10s, 这个时间恰好跟semaphore的超时时 ...
- native C++ 动态调用.NET DLL
关于这个问题找了好多地方,都只有第二种解决办法,可是我要返回一个字符串,没办法,继续找,最后还是在http://blogs.msdn.com/b/msdnforum/archive/2010/07/0 ...
- python利用setsockopt获得端口重用
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 假如端口呗socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个 ...
- ClassNotFoundException------我有一句妈卖批一定要讲
最近在写<Writing Compilers and Interpreters>一书的代码,本来打算用vim敲代码,一来每个字母都要自己敲,而来就当练习vim,但是感觉真是太不方便了,各种 ...
- JS---BOM---定时器
定时器 参数1:函数 参数2:时间---毫秒---1000毫秒--1秒 执行过程: 页面加载完毕后, 过了1秒, 执行一次函数的代码, 又过了1秒再执行函数..... 返回值就是定时器的id值 v ...
- Android odex,oat文件的反编译,回编译
现在,许多Android手机的ROM包在生成过程中都启用优化,把jar文件抽空,生成odex/oat和vdex文件,以在运行时省掉编译时间.如果想对这些jar进行修改,就要修改它们所对应的odex或者 ...
- 大数据学习笔记——HBase使用bulkload导入数据
HBase使用bulkload批量导入数据 HBase可使用put命令向一张已经建好了的表中插入数据,然而,当遇到数据量非常大的情况,一条一条的进行插入效率将会大大降低,因此本篇博客将会整理提高批量导 ...
- 大部分人都会忽略的Python易错点总结
python中复数实现(-2) 0.5和开根号sqrt(-2)的区别** (-2)**0.5和sqrt(-2)是不同的,前者是复数后者是会报错的. print((-2)**0.5) #输出:(8.65 ...
- 基于SpringBoot前后端分离的点餐系统
基于SpringBoot前后端分离的点餐系统 开发环境:主要采用Spring boot框架和小程序开发 项目简介:点餐系统,分成卖家端和买家端.买家端使用微信小程序开发,实现扫码点餐.浏览菜单.下单. ...
- XSS劫持cookie登录
<script>alert (document.cookie)</script> 获取cookie 实验环境用的DVWA 先用系统账号登录,admin password ...