单元测试框架TestableMock快速入门(四):Mock的生效范围
目录
一、概述
二、使用案例
一、概述
在@MockMethod
和@MockConstructor
注解上都有一个scope
参数,其可选值有两种:
MockScope.GLOBAL
:该Mock方法将全局生效;MockScope.ASSOCIATED
:该Mock方法仅对Mock容器关联测试类中的测试用例生效;
对于常规项目而言,单元测试里需要被Mock的调用都是由于其中包含了不需要或不便于测试的逻辑,譬如“依赖外部系统”、“包含随机结果”、“执行非常耗时”等等,这类调用在整个单元测试的生命周期里都应该被Mock方法置换,不论调用的发起者是谁。因此TestableMock
默认所有Mock方法都是全局生效的,即scope
默认值为MockScope.GLOBAL
。
二、使用案例
举例来说,
CookerService
和SellerService
是两个需要被测试的类,假设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的生效范围相关推荐
- 分布式应用框架Akka快速入门
转自:分布式应用框架Akka快速入门_jmppok的专栏-CSDN博客_akka 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akk ...
- 微信小程序快速入门+四个实战小程序(一)——入门准备
一)系列达成目标介绍 二)小程序创建的准备 1)注册开发者账号 2)下载编译器 ------------------------------------------------------ 一)系列达 ...
- Spring入门第一讲——Spring框架的快速入门
Spring的概述 什么是Spring? 我们可以从度娘上看到这样有关Spring的介绍: 说得更加详细一点,Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架, ...
- Struts2入门第一讲——Struts2框架的快速入门
Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握Struts2框架几乎成为Web ...
- go语言MVC框架beego快速入门
beego快速入门 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornad ...
- php yii2框架教程,Yii2框架使用快速入门
Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用. 因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用, 如门户网站.社区.内容管理系统(CM ...
- Shiro安全框架【快速入门】就这一篇!
Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...
- Python 什么是flask框架?快速入门
一.Python flask框架 前言 1.Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析. ...
- Python框架Django快速入门
原文地址:https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to-django-pa ...
- python数据处理框架_python 最快 web 框架 Sanci 快速入门
简介 Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快. 除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求.这意味着你可以使用新的 a ...
最新文章
- 刻意练习:LeetCode实战 -- Task27.分发饼干
- 报名 | 搜狐×清华:第三届内容识别算法大赛,比武招新两不误!
- JStorm与Storm源码分析(二)--任务分配,assignment
- [转载]日历设计之重复事件规则设计
- makefile文件中的依赖关系理解
- MTU 和 MSS 区别
- 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
- php返回支付状态,magento paypal返回支付状态
- 如何删除在Github中创建的项目
- 一个例子搞懂Nacos服务发现
- C语言的隐式类型转换
- 一图看尽史上三次浏览器大战
- 关于数据库方言MySQLDialect、MySQL5Dialect、MySQL55Dialect、MySQL57Dialect、MySQL8Dialect之间的区别与联系
- Mac终端远程连接历史记录怎么清除
- C++数据结构 交通咨询系统设计(一)
- 利用Eclipse-Python简单爬取京东商城书籍信息进行可视化
- 使用 ES6 编写更好的 JavaScript Part II:深入探究 [类]
- 简单实现PDF转换为WORD,去水印
- eclipse安装及使用
- SpringBoot 最简单的使用异步线程案例 @Async
热门文章
- linux 防火墙安装在哪,Linux下Shorewall防火墙安装和配置
- java ssh jar_java应用程序远程登录linux并执行其命令(ssh jar包)
- 容器技术Docker K8s 34 容器服务ACK基础与进阶-安全管理
- 阿里云云计算 19 块存储的使用
- 权重衰减(基于线性回归)
- java tcp socket 关闭_JAVA SOCKET和TCP四次挥手
- 448.找到所有数组中消失的数字
- 190.颠倒二进制位
- 计算二叉树的叶子结点个数
- DL实战(2):SiamFC - TensorFlow配置