参考链接

1.Mock测试的目的两个:(1)验证方法调用;(2)指定某个方法的返回值,或者是执行特定的动作

2.所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两大目的

  1. 验证这个对象的某些方法的调用情况,调用了多少次,参数是什么等等

  2. 指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作

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使用相关推荐

  1. 如何通过fiddler来进行接口数据mock测试

    如何通过fiddler来进行接口数据mock测试 1.使用fiddler进行接口mock测试的使用场景有哪些? 个性化推荐场景 每次返回的数据都不一样 数据量大,查找特定数据困难 生产环境,改动难度大 ...

  2. 电脑软件超时、MOCK测试方案

    大家好,我是谭叔. 今天,谭叔跟大家分享我在测试电脑软件(程序)时,模拟超时环境的N种尝试,以及电脑软件(程序)的MOCK测试方案. 超时环境 在日常测试工作中,弱网环境.超时请求等异常测试,是必不可 ...

  3. mockito mock测试框架

    1.简介 mock,[mɒk],adj. 虚拟的,模拟的. 如果你的代码对另一个类或者接口有依赖,mock测试能够帮你模拟这些依赖,从而完成测试. 使用场景: 类A有一个方法fun(B b),它依赖于 ...

  4. java junit mock_使用Mockito进行Java的Mock测试

    测试替身 dummy用于传递,不会真正使用,例如用于填充的方法的参数列表. Fake有简单实现,但通常被简化,比如在内存数据库,而不是真正的数据库中使用. Stub是接口或类中部分实现,测试时使用其实 ...

  5. 使用junit+mockito进行mock测试实例

    刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点--..一个大的程序启动又慢,还要登陆,还要 ...

  6. dubbo服务接口如何mock_小程聊微服务-基于dubbo的mock测试系统

    一.说在前面 基于微服务或者SOA的自动化测试系统每个公司都有自己的特有的,我今天就主要介绍一下,我们研发的一套mock测试系统. 二.目前面临的问题 1.测试人员面临的测试问题 我公司目前用的是基于 ...

  7. java unit test moke_惊了,unittest做接口mock测试竟然这么简单

    在项目研发的时候,一般开发会先提供接口文档,虽然很多接口并没有被实现,但测试可以提前写好Mock,等接口实现时可以快速完成该接口的自动话代码编写,进而提高接口自动化测试效率,那么使用Python如何实 ...

  8. 接口Mock测试结合postman运用

    目录 一.接口Mock测试 1.1 基本概念 1.2实现方式 二.Moco框架 2.1 Moco介绍 2.1.1 环境搭建 2.1.2  Moco运行 2.2常用参数配置 2.2.1定义请求方法 2. ...

  9. 测试过程中为什么要做接口Mock测试,以及如何做

    文章目录 关于Mock测试 什么是Mock测试? 为什么要进行Mock测试? Mock对象适用场景 Mock测试的优势 Mock测试存在的问题 Mock测试方式 Mock Server-Moco fi ...

最新文章

  1. Vue之概述、基本使用、data数据和if条件渲染
  2. 计算机原理存储器实验报告,计算机组成原理存储器实验报告.doc
  3. 学习Java编程的五步要素
  4. Mysqli面向对象操作数据库
  5. Delphi clientdataset的详细介绍
  6. 通过命令行新建qt项目,并编译打包
  7. din算法 代码_DIN算法代码详细解读
  8. ISAKMP主模式分析二
  9. namenode倒换原因分析
  10. jdk1.8_API中文帮助文档
  11. 数据挖掘概念与技术_第三版_课后习题
  12. 原创nio socket mina+javascript+flash实现commet长连接网页聊天室
  13. android app icon素材,史上最全的APP图标模板素材以及设计格式最全的
  14. python gdal迭代写为ENVI的dat格式
  15. D4.8 Write transactions
  16. 领导力提升的科学:如何提升领导力?
  17. 关于《Python绝技:运用Python成为顶级黑客》的学习笔记
  18. 简单并不粗暴:自学产品的8个方法
  19. 薅羊毛常见问题合集——更新中
  20. 一篇最通俗易懂的性能调优总结,这篇就够了

热门文章

  1. 什么的发明使研制着能够成功研制微型计算机,1_1_科普知识竞赛试题(小学)
  2. 美国国防部“轻便安全盘”可否民用?
  3. Spring Cloud 微服务实战精品文章大汇总,错过了血亏!
  4. 电子漫画系列更新11张美图,共计58张,收藏收藏!
  5. 利用matlab M_Map工具制作GPS测站分布图
  6. 蚊子看了想咬人,人类看了都说好
  7. echarts 曲线走势图
  8. 7-3 学习打卡(12.26)
  9. [bzoj4398] 福慧双修 最短路 二进制分组
  10. STM32从零开始(四)详解GPIO库函数