目录

一、概述

二、使用案例


一、概述

@MockMethod@MockConstructor注解上都有一个scope参数,其可选值有两种:

  • MockScope.GLOBAL:该Mock方法将全局生效;
  • MockScope.ASSOCIATED:该Mock方法仅对Mock容器关联测试类中的测试用例生效;

对于常规项目而言,单元测试里需要被Mock的调用都是由于其中包含了不需要或不便于测试的逻辑,譬如“依赖外部系统”、“包含随机结果”、“执行非常耗时”等等,这类调用在整个单元测试的生命周期里都应该被Mock方法置换,不论调用的发起者是谁。因此TestableMock默认所有Mock方法都是全局生效的,即scope默认值为MockScope.GLOBAL

二、使用案例

举例来说,CookerServiceSellerService是两个需要被测试的类,假设CookerService的代码里的hireXxx()cookXxx()方法都需要依赖外部系统。因此在进行单元测试时,开发者在CookerService关联的Mock容器里使用@MockMethod注解定义了这些调用的替代方法。

此时,若该Mock方法的scope值为MockScope.GLOBAL,则不论是在SellerServiceTest测试类还是在CookerServiceTest测试类的测试用例,只要直接或间接的执行到这行调用,都会被置换为调用Mock方法。若该Mock方法的scope值为MockScope.ASSOCIATED,则Mock只对CookerServiceTest类中的测试用例生效,而SellerServiceTest类中的测试用例在运行过程中执行到了CookerService类的相关代码,将会执行原本的调用。

【a】编写CookerService被测试类

package com.wsh.testable.mock.testablemockdemo;/*** 目标类,此类中的一些调用将会被Mock掉*/
public class CookerService {private static String hireSandwichCooker() {return "Real-Sandwich-Cooker";}private static String hireHamburgerCooker() {return "Real-Hamburger-Cooker";}private String cookSandwich() {return "Real-Sandwich";}private String cookHamburger() {return "Real-Hamburger";}public String prepareSandwich() {return hireSandwichCooker() + " & " + cookSandwich();}public String prepareHamburger() {return hireHamburgerCooker() + " & " + cookHamburger();}}

【b】编写SellerService被测试类

package com.wsh.testable.mock.testablemockdemo;/*** 被测类,会访问`CookerService`里的方法*/
public class SellerService {private CookerService cookerService = new CookerService();public String sellSandwich() {return cookerService.prepareSandwich();}public String sellHamburger() {return cookerService.prepareHamburger();}
}

【c】编写针对CookerService被测试类的Mock容器CookerServiceMock

package com.wsh.testable.mock.testablemockdemo;import com.alibaba.testable.core.annotation.MockMethod;
import com.alibaba.testable.core.model.MockScope;/*** 此Mock容器类针对CookerService被测试类*/
class CookerServiceMock {/*** 默认scope为MockScope.GLOBAL,全局有效,所以CookerService、SellerService只要* 有外部调用到此Mock方法,都将执行Mock之后的方法*/@MockMethod(targetClass = CookerService.class)public static String hireSandwichCooker() {return "Fake-Sandwich-Cooker";}/*** 作用域为MockScope.ASSOCIATED, 则Mock只对CookerServiceTest类中的测试用例生效,而SellerServiceTest类中的测试用例在* 运行过程中执行到了CookerService类的相关代码,将会执行原本的调用。*/@MockMethod(targetClass = CookerService.class, scope = MockScope.ASSOCIATED)public static String hireHamburgerCooker() {return "Fake-Hamburger-Cooker";}@MockMethod(targetClass = CookerService.class)private String cookSandwich() {return "Faked-Sandwich";}@MockMethod(targetClass = CookerService.class, scope = MockScope.ASSOCIATED)private String cookHamburger() {return "Faked-Hamburger";}
}

可以看到,在Mock容器类中,我们在MockMethod注解上标注了此Mock方法的作用域。如果标注了MockScope.ASSOCIATED,Mock只对CookerServiceTest类中的测试用例生效,而 SellerServiceTest类中的测试用例在运行过程中执行到了CookerService类的相关代码,将会执行原本的调用。

【d】编写CookerServiceTest测试类

package com.wsh.testable.mock.testablemockdemo;import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;class CookerServiceTest {private CookerService cookerService = new CookerService();@Testvoid should_cooker_sandwich() {assertEquals("Fake-Sandwich-Cooker & Faked-Sandwich",cookerService.prepareSandwich());}/*** 因为作用域为:MockScope.ASSOCIATED,Mock只对CookerServiceTest类中的测试用例生效,而* SellerServiceTest类中的测试用例在运行过程中执行到了CookerService类的相关代码,将会执行原本的调用。*/@Testvoid should_cooker_hamburger() {assertEquals("Fake-Hamburger-Cooker & Faked-Hamburger",cookerService.prepareHamburger());}}

【e】编写SellerServiceTest测试类

package com.wsh.testable.mock.testablemockdemo;import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;class SellerServiceTest {private SellerService sellerService = new SellerService();@Testvoid should_sell_sandwich() {assertEquals("Fake-Sandwich-Cooker & Faked-Sandwich", sellerService.sellSandwich());}/*** 因为作用域为:MockScope.ASSOCIATED,Mock只对CookerServiceTest类中的测试用例生效,而* SellerServiceTest类中的测试用例在运行过程中执行到了CookerService类的相关代码,将会执行原本的调用。* <p>* 原本调用就是分别返回: "Real-Hamburger-Cooker"、"Real-Hamburger"。*/@Testvoid should_sell_hamburger() {assertEquals("Real-Hamburger-Cooker & Real-Hamburger", sellerService.sellHamburger());}}

单元测试框架TestableMock快速入门(四):Mock的生效范围相关推荐

  1. 分布式应用框架Akka快速入门

    转自:分布式应用框架Akka快速入门_jmppok的专栏-CSDN博客_akka 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akk ...

  2. 微信小程序快速入门+四个实战小程序(一)——入门准备

    一)系列达成目标介绍 二)小程序创建的准备 1)注册开发者账号 2)下载编译器 ------------------------------------------------------ 一)系列达 ...

  3. Spring入门第一讲——Spring框架的快速入门

    Spring的概述 什么是Spring? 我们可以从度娘上看到这样有关Spring的介绍: 说得更加详细一点,Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架, ...

  4. Struts2入门第一讲——Struts2框架的快速入门

    Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握Struts2框架几乎成为Web ...

  5. go语言MVC框架beego快速入门

    beego快速入门 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornad ...

  6. php yii2框架教程,Yii2框架使用快速入门

    Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用. 因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站.社区.内容管理系统(CM ...

  7. Shiro安全框架【快速入门】就这一篇!

    Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...

  8. Python 什么是flask框架?快速入门

    一.Python flask框架 前言 1.Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析. ...

  9. Python框架Django快速入门

    原文地址:https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to-django-pa ...

  10. python数据处理框架_python 最快 web 框架 Sanci 快速入门

    简介 Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快. 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求.这意味着你可以使用新的 a ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task27.分发饼干
  2. 报名 | 搜狐×清华:第三届内容识别算法大赛,比武招新两不误!
  3. JStorm与Storm源码分析(二)--任务分配,assignment
  4. [转载]日历设计之重复事件规则设计
  5. makefile文件中的依赖关系理解
  6. MTU 和 MSS 区别
  7. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
  8. php返回支付状态,magento paypal返回支付状态
  9. 如何删除在Github中创建的项目
  10. 一个例子搞懂Nacos服务发现
  11. C语言的隐式类型转换
  12. 一图看尽史上三次浏览器大战
  13. 关于数据库方言MySQLDialect、MySQL5Dialect、MySQL55Dialect、MySQL57Dialect、MySQL8Dialect之间的区别与联系
  14. Mac终端远程连接历史记录怎么清除
  15. C++数据结构 交通咨询系统设计(一)
  16. 利用Eclipse-Python简单爬取京东商城书籍信息进行可视化
  17. 使用 ES6 编写更好的 JavaScript Part II:深入探究 [类]
  18. 简单实现PDF转换为WORD,去水印
  19. eclipse安装及使用
  20. SpringBoot 最简单的使用异步线程案例 @Async

热门文章

  1. linux 防火墙安装在哪,Linux下Shorewall防火墙安装和配置
  2. java ssh jar_java应用程序远程登录linux并执行其命令(ssh jar包)
  3. 容器技术Docker K8s 34 容器服务ACK基础与进阶-安全管理
  4. 阿里云云计算 19 块存储的使用
  5. 权重衰减(基于线性回归)
  6. java tcp socket 关闭_JAVA SOCKET和TCP四次挥手
  7. 448.找到所有数组中消失的数字
  8. 190.颠倒二进制位
  9. 计算二叉树的叶子结点个数
  10. DL实战(2):SiamFC - TensorFlow配置