接口的Mock测试及Mockito使用
参考链接
1.Mock测试的目的两个:(1)验证方法调用;(2)指定某个方法的返回值,或者是执行特定的动作
2.所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两大目的
验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等
指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作
3. (1)UserManager mockUserManager = Mockito.mock(UserManager.class); 需要我们创建了一个mock对象;
(2)我们必须在调用 loginPresenter.login() 之前,把 mUserManager 引用换成 mockUserManager 所引用的mock对象。最简单的办法,就是加一个setter:
public class LoginPresenter {private UserManager mUserManager = new UserManager();public void login(String username, String password) {if (username == null || username.length() == 0) return;if (password == null || password.length() < 6) return;mUserManager.performLogin(username, password);}public void setUserManager(UserManager userManager) { //<==this.mUserManager = userManager;}}
写出来的测试代码如下:
@Test
public void testLogin() throws Exception {UserManager mockUserManager = Mockito.mock(UserManager.class);LoginPresenter loginPresenter = new LoginPresenter();loginPresenter.setUserManager(mockUserManager); //<==loginPresenter.login("xiaochuang", "xiaochuang password");Mockito.verify(mockUserManager).performLogin("xiaochuang", "xiaochuang password");
}
4.验证一个对象的某个method得到调用的方法:
Mockito.verify(mockUserManager).performLogin("xiaochuang", "xiaochuang password");
Mockito的静态方法 :对于调用次数的验证,除了可以验证固定的多少次,还可以验证最多,最少从来没有等等,方法分别 是: atMost(count), atLeast(count), never() 等等。
5. 指定mock对象的某些方法的行为: 指定某个方法的返回值,或者是执行特定的动作
(1)
Mockito.verify(mockUserManager).performLogin(Mockito.anyString(), Mockito.anyString());
LoginPresenter 的 login 方法是如下:
public void login(String username, String password) {if (username == null || username.length() == 0) return;//假设我们对密码强度有一定要求,使用一个专门的validator来验证密码的有效性if (mPasswordValidator.verifyPassword(password)) return; //<==mUserManager.performLogin(null, password);
}
这种指定mock对象的某个方法,让它返回特定值的写法如下:
Mockito.when(mockObject.targetMethod(args)).thenReturn(desiredReturnValue);
//先创建一个mock对象
PasswordValidator mockValidator = Mockito.mock(PasswordValidator.class);//当调用mockValidator的verifyPassword方法,同时传入"xiaochuang_is_handsome"时,返回true
Mockito.when(mockValidator.verifyPassword("xiaochuang_is_handsome")).thenReturn(true);//当调用mockValidator的verifyPassword方法,同时传入"xiaochuang_is_not_handsome"时,返回false
Mockito.when(validator.verifyPassword("xiaochuang_is_not_handsome")).thenReturn(false);
//当调用mockValidator的verifyPassword方法时,返回true,无论参数是什么
Mockito.when(validator.verifyPassword(anyString())).thenReturn(true);
(2)
指定一个方法执行特定的动作,这个功能一般是用在目标的方法是void类型的时候:
LoginPresenter 的 login() 方法:
public void loginCallbackVersion(String username, String password) {if (username == null || username.length() == 0) return;//假设我们对密码强度有一定要求,使用一个专门的validator来验证密码的有效性if (mPasswordValidator.verifyPassword(password)) return;//login的结果将通过callback传递回来。mUserManager.performLogin(username, password, new NetworkCallback() { //<==@Overridepublic void onSuccess(Object data) {//update view with data}@Overridepublic void onFailure(int code, String msg) {//show error msg}});
}
我们想让 mUserManager 直接调用传入的 NetworkCallback 的 onSuccess 或 onFailure 方法。这种指定mock对象执行特定的动作的写法如下:
Mockito.doAnswer(desiredAnswer).when(mockObject).targetMethod(args); 传给 doAnswer() 的是一个 Answer 对象,我们想要执行什么样的动作,就在这里面实现
Mockito.doAnswer(new Answer() {@Overridepublic Object answer(InvocationOnMock invocation) throws Throwable {//这里可以获得传给performLogin的参数Object[] arguments = invocation.getArguments();//callback是第三个参数NetworkCallback callback = (NetworkCallback) arguments[2];callback.onFailure(500, "Server error");return 500;}
}).when(mockUserManager).performLogin(anyString(), anyString(), any(NetworkCallback.class));
当调用 mockUserManager 的 performLogin 方法时,会执行answer里面的代码,我们上面的例子是直接调用传入的 callback 的 onFailure 方法,同时传给 onFailure 方法500和"Server error"。
自己的实例:采用第5点方法(1):
// 根据客户编号修改客户状态@Testpublic void updateCustomerStatusByCustomerNo(){String traceLogId = "110";String customerNo = "100001";CustomerBaseInfoReqDTO reqDTO = new CustomerBaseInfoReqDTO();reqDTO.setCustomerNo(customerNo);reqDTO.setUpdatedAt(new Date());reqDTO.setUpdatedBy("nazi");reqDTO.setStatus(CustBaseInfoStatus.CLOSE.getCode());Mockito.when(customerBaseInfoBiz.updateCustomerStatusByCustomerNo(Mockito.any(CustomerBaseInfoReqDTO.class))).thenReturn(Boolean.TRUE);Result<Boolean> result = customerBaseInfoService.updateCustomerStatusByCustomerNo(reqDTO, traceLogId);Assert.assertTrue(result.isSuccess());System.out.println("----------------------分隔线--------------------------");Mockito.when(customerBaseInfoBiz.updateCustomerStatusByCustomerNo(Mockito.any(CustomerBaseInfoReqDTO.class))).thenThrow(BizServerException.class);result = customerBaseInfoService.updateCustomerStatusByCustomerNo(reqDTO, traceLogId);Assert.assertFalse(result.isSuccess());System.out.println("----------------------分隔线--------------------------");Mockito.when(customerBaseInfoBiz.updateCustomerStatusByCustomerNo(Mockito.any(CustomerBaseInfoReqDTO.class))).thenThrow(NullPointerException.class);result = customerBaseInfoService.updateCustomerStatusByCustomerNo(reqDTO, traceLogId);Assert.assertFalse(result.isSuccess());}
// 根据客户号查询客户账户信息@Testpublic void findCustAcctByCustomerNo(){List<CustomerAccountQueryResDTO> resDTOList = new ArrayList<>();Mockito.when(customerAccountManager.queryByCustomerNo(Mockito.any())).thenReturn(resDTOList);String customerNo = "0000000000020005";Result<List<CustomerAccountQueryResDTO>> result = customerInfoQueryService.findCustAcctByCustomerNo(customerNo,"110");Assert.assertTrue(result.isSuccess());}
Spy
目的:除非指定,否者调用这个对象的默认实现,同时又能拥有验证方法调用的功能
相异点:
spy与mock的唯一区别就是默认行为不一样:spy对象的方法默认调用真实的逻辑,mock对象的方法默认什么都不做,或直接返回默认值
//假设目标类的实现是这样的
public class PasswordValidator {public boolean verifyPassword(String password) {return "xiaochuang_is_handsome".equals(password);}
}@Test
public void testSpy() {//跟创建mock类似,只不过调用的是spy方法,而不是mock方法。spy的用法PasswordValidator spyValidator = Mockito.spy(PasswordValidator.class);//在默认情况下,spy对象会调用这个类的真实逻辑,并返回相应的返回值,这可以对照上面的真实逻辑spyValidator.verifyPassword("xiaochuang_is_handsome"); //truespyValidator.verifyPassword("xiaochuang_is_not_handsome"); //false//spy对象的方法也可以指定特定的行为Mockito.when(spyValidator.verifyPassword(anyString())).thenReturn(true);//同样的,可以验证spy对象的方法调用情况spyValidator.verifyPassword("xiaochuang_is_handsome");Mockito.verify(spyValidator).verifyPassword("xiaochuang_is_handsome"); //pass
}
接口的Mock测试及Mockito使用相关推荐
- 如何通过fiddler来进行接口数据mock测试
如何通过fiddler来进行接口数据mock测试 1.使用fiddler进行接口mock测试的使用场景有哪些? 个性化推荐场景 每次返回的数据都不一样 数据量大,查找特定数据困难 生产环境,改动难度大 ...
- 电脑软件超时、MOCK测试方案
大家好,我是谭叔. 今天,谭叔跟大家分享我在测试电脑软件(程序)时,模拟超时环境的N种尝试,以及电脑软件(程序)的MOCK测试方案. 超时环境 在日常测试工作中,弱网环境.超时请求等异常测试,是必不可 ...
- mockito mock测试框架
1.简介 mock,[mɒk],adj. 虚拟的,模拟的. 如果你的代码对另一个类或者接口有依赖,mock测试能够帮你模拟这些依赖,从而完成测试. 使用场景: 类A有一个方法fun(B b),它依赖于 ...
- java junit mock_使用Mockito进行Java的Mock测试
测试替身 dummy用于传递,不会真正使用,例如用于填充的方法的参数列表. Fake有简单实现,但通常被简化,比如在内存数据库,而不是真正的数据库中使用. Stub是接口或类中部分实现,测试时使用其实 ...
- 使用junit+mockito进行mock测试实例
刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点--..一个大的程序启动又慢,还要登陆,还要 ...
- dubbo服务接口如何mock_小程聊微服务-基于dubbo的mock测试系统
一.说在前面 基于微服务或者SOA的自动化测试系统每个公司都有自己的特有的,我今天就主要介绍一下,我们研发的一套mock测试系统. 二.目前面临的问题 1.测试人员面临的测试问题 我公司目前用的是基于 ...
- java unit test moke_惊了,unittest做接口mock测试竟然这么简单
在项目研发的时候,一般开发会先提供接口文档,虽然很多接口并没有被实现,但测试可以提前写好Mock,等接口实现时可以快速完成该接口的自动话代码编写,进而提高接口自动化测试效率,那么使用Python如何实 ...
- 接口Mock测试结合postman运用
目录 一.接口Mock测试 1.1 基本概念 1.2实现方式 二.Moco框架 2.1 Moco介绍 2.1.1 环境搭建 2.1.2 Moco运行 2.2常用参数配置 2.2.1定义请求方法 2. ...
- 测试过程中为什么要做接口Mock测试,以及如何做
文章目录 关于Mock测试 什么是Mock测试? 为什么要进行Mock测试? Mock对象适用场景 Mock测试的优势 Mock测试存在的问题 Mock测试方式 Mock Server-Moco fi ...
最新文章
- Vue之概述、基本使用、data数据和if条件渲染
- 计算机原理存储器实验报告,计算机组成原理存储器实验报告.doc
- 学习Java编程的五步要素
- Mysqli面向对象操作数据库
- Delphi clientdataset的详细介绍
- 通过命令行新建qt项目,并编译打包
- din算法 代码_DIN算法代码详细解读
- ISAKMP主模式分析二
- namenode倒换原因分析
- jdk1.8_API中文帮助文档
- 数据挖掘概念与技术_第三版_课后习题
- 原创nio socket mina+javascript+flash实现commet长连接网页聊天室
- android app icon素材,史上最全的APP图标模板素材以及设计格式最全的
- python gdal迭代写为ENVI的dat格式
- D4.8 Write transactions
- 领导力提升的科学:如何提升领导力?
- 关于《Python绝技:运用Python成为顶级黑客》的学习笔记
- 简单并不粗暴:自学产品的8个方法
- 薅羊毛常见问题合集——更新中
- 一篇最通俗易懂的性能调优总结,这篇就够了
热门文章
- 什么的发明使研制着能够成功研制微型计算机,1_1_科普知识竞赛试题(小学)
- 美国国防部“轻便安全盘”可否民用?
- Spring Cloud 微服务实战精品文章大汇总,错过了血亏!
- 电子漫画系列更新11张美图,共计58张,收藏收藏!
- 利用matlab M_Map工具制作GPS测站分布图
- 蚊子看了想咬人,人类看了都说好
- echarts 曲线走势图
- 7-3 学习打卡(12.26)
- [bzoj4398] 福慧双修 最短路 二进制分组
- STM32从零开始(四)详解GPIO库函数