阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

最近栈长注意到阿里开源了自家的 Mock 工具:TestableMock,该工具号称最轻量、简单、舒适的 Mock 测试工具,功能十分强大,媲美 PowerMock,用法比 Mockito 还要简洁,还不挑框架,指哪换哪,一个 @MockMethod 注解打天下。。。

这么强大的么?栈长赶紧来体验一翻!

TestableMock 简介

TestableMock 开源地址:

https://github.com/alibaba/testable-mock

TestableMock 在 2020 年 12 月开始开源,出自阿里云云效团队,主要想解决 Java 开发者在日常单元测试中经常遇到的痛点:

  • 外部依赖Mock繁琐

  • 私有方法难测试

  • 无返回值方法难测试

  • 复杂参数难构造

它所承载的职责是 “让Java没有难测的方法”,换种思路写Mock,让单元测试更简单,这也是 TestableMock 名字的来历。

无需初始化,不挑测试框架,甭管要换的是私有方法、静态方法、构造方法还是其他任何类的任何方法,也甭管要换的对象是怎么创建的。

写好 Mock 定义,加个 @MockMethod 注解,一切统统搞定。

主流Mock工具对比

在 TestableMock 开源之前,目前市面上主流的 Mock 工具主要有:

  • Mockito

  • Spock

  • PowerMock

  • JMockit

  • EasyMock

  • ....

Mockito 应该是目前使用最多的 Mock 工具了,因为它使用足够简单,在 IntelliJ IDEA 和 Eclipse 开发工具上也都有专用的插件支持,但 Mock 功能相对来说还是较弱,不能覆盖所有应用场景。因为其使用的是动态代理技术,我们都知道,动态代理只能在方法前后环绕,有一定的局限性,所以 final 类型、静态方法、私有方法全都无法覆盖到。

上面所列的主流的 Mock 工具也只有 PowerMock 在功能上能够与 TestableMock 持平,但 PowerMock 使用较为复杂,而且由于使用的是自定义类加载器技术,所以也还会存在一定的问题。

下面来看下具体对比:

工具 原理 最小Mock单元 被Mock方法限制 难度 IDE支持
Mockito 动态代理 不能Mock私有/静态和构造方法 较容易 很好
Spock 动态代理 不能Mock私有/静态和构造方法 较复杂 一般
PowerMock 自定义类加载器 任何方法皆可 较复杂 较好
JMockit 运行时字节码修改 不能Mock构造方法 较复杂 一般
TestableMock 运行时字节码修改 方法 任何方法皆可 很容易 一般

TestableMock 和 JMockit 底层一致,使用的是 "运行时字节码修改" 技术,在单元测试启动时就扫描测试类和被测类的字节码,完成 Mock 方法的替换。

现在综合看来,阿里开源的 TestableMock 是最牛逼的了,这是要干掉市面上所有 Mock 工具!另外,关注公众号Java技术栈,在后台回复:工具,可以获取我整理的 Java 开发工具系列干货,非常齐全。

上手 TestableMock

在项目中的 pom.xml 文件中增加 testable 相关依赖及单元测试相关依赖和插件,完整的配置如下:

<properties><testable.version>0.4.9</testable.version><junit.version>5.6.2</junit.version>
</properties><dependencies><dependency><groupId>com.alibaba.testable</groupId><artifactId>testable-all</artifactId><version>${testable.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency>
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><argLine>-javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar</argLine></configuration></plugin></plugins>
</build>

这里栈长以 Maven 为示例集成使用 TestableMock,Gradle 版本请参考官方文档。另外,关注公众号Java技术栈,在后台回复:Maven,可以获取我整理的 Maven 系列教程,非常齐全。

增加一个类,调用任意方法、成员方法、静态方法:

/*** @from 公众号:Java技术栈* @author 栈长*/
public class TestableMock {/*** 调用任意方法*/public String commonMethod() {return " www ".trim() + "." + " javastack".substring(1) + "www.javastack.cn".startsWith(".com");}/*** 调用成员、静态方法*/public String memberMethod(String s) {return "{ \"result\": \"" + innerMethod(s) + staticMethod() + "\"}";}private static String staticMethod() {return "WWW_JAVASTACK_CN";}private String innerMethod(String website) {return "our website is: " + website;}}

增加单元测试类:

import com.alibaba.testable.core.annotation.MockMethod;
import org.junit.jupiter.api.Test;import static com.alibaba.testable.core.matcher.InvokeVerifier.verify;
import static org.junit.jupiter.api.Assertions.assertEquals;/*** @author 栈长* @from 公众号:Java技术栈*/
class TestableMockTest {private TestableMock testableMock = new TestableMock();/*** Mock 任意方法* @return*/@MockMethod(targetClass = String.class)private String trim() {return "http://www";}@MockMethod(targetClass = String.class, targetMethod = "substring")private String substr(int i) {return "javastack.cn_";}@MockMethod(targetClass = String.class)private boolean startsWith(String website) {return false;}/*** Mock 成员方法* @param text* @return*/@MockMethod(targetClass = TestableMock.class)private String innerMethod(String text) {return "mock_" + text;}/*** Mock 静态方法* @return*/@MockMethod(targetClass = TestableMock.class)private String staticMethod() {return "_MOCK_JAVASTACK";}@Testvoid commonMethodTest() {assertEquals("http://www.javastack.cn_false", testableMock.commonMethod());verify("trim").withTimes(1);verify("substr").withTimes(1);verify("startsWith").withTimes(1);}@Testvoid memberMethodTest() {assertEquals("{ \"result\": \"mock_hello_MOCK_JAVASTACK\"}", testableMock.memberMethod("hello"));verify("innerMethod").withTimes(1);verify("staticMethod").withTimes(1);verify("innerMethod").with("hello");verify("staticMethod").with();}}

在以上单元测试类中,以  @MockMethod 注解标识的方法都是 Mock 方法,Mock 了任意方法、成员方法、静态方法。

使用确实很简单,非常灵活,功能也确实比动态代理那种要强大,一个 @MockMethod 注解走天下,可以扔掉其他的 Mock 工具了。

参考文档:

  • https://github.com/alibaba/testable-mock

  • https://alibaba.github.io/testable-mock/

原文地址:阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

参考文章:TestableMock这一篇就够了_upcoming的专栏-CSDN博客_testablemock

阿里TestableMock正式开源,最容易上手的 Mock 工具。相关推荐

  1. 阿里好的开源项目有哪些(善用工具)

    阿里好的开源项目有哪些(善用工具) 一.总结 一句话总结:善用工具,可以极大的提升开发效率. 1.阿里好的开源项目自己目前可能用得上的有哪些(举两个)? JSON处理器 fastjson 开源数据库A ...

  2. 数据3分钟丨Gartner宣布明年12大战略性技术趋势;PolarDB-X正式开源;OceanBase 3.2发布...

    数据 3 分钟 由 ACDU (中国 DBA 联盟) 与墨天轮联合出品的全新视频节目上线啦-三分钟带你来了解数据行业动态,节目内容主要包含数据行业最新的产品发布.公司大事件.行业新闻等. 本期内容概览 ...

  3. 告别国外 IDE,阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

    经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性.高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源. 一  OpenSumi ...

  4. 阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

    简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性.高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源. 作者 | Ope ...

  5. 阿里Mock工具正式开源,轻松干掉市面上所有Mock工具

    最近栈长注意到阿里开源了自家的 Mock 工具:TestableMock,该工具号称最轻量.简单.舒适的 Mock 测试工具,功能十分强大,媲美 PowerMock,用法比 Mockito 还要简洁, ...

  6. 阿里千万实例可观测采集器-iLogtail正式开源

    简介:11月23日,阿里正式开源可观测数据采集器iLogtail.作为阿里内部可观测数据采集的基础设施,iLogtail承载了阿里巴巴集团.蚂蚁的日志.监控.Trace.事件等多种可观测数据的采集工作 ...

  7. ​苹果官网出现价格Bug:千元产品变百元;阿里云量子模拟平台“太章2.0”正式开源;Vant 3.0发布|极客头条...

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「 ...

  8. 阿里宣布Atlas正式开源:带你重返App开发的田园时代

    继Weex之后,阿里在移动技术领域又有开源大动作. 3月13日,手机淘宝安卓客户端容器化框架Atlas正式宣布开源( https://github.com/alibaba/atlas ).Atlas由 ...

  9. 之江天枢正式开源!一文详解天枢核心优势

    数据驱动的智能技术是智能化浪潮的核心引擎,其关键在于大数据和高算力支撑的深度学习机制.开发并开源高性能的人工智能平台,是推动新一轮人工智能跨越发展的核心和基础. 8月1日,由之江实验室联合北京一流科技 ...

最新文章

  1. R Learnilng 十八讲13-17
  2. Android 观察系统中短信内容的变化(内容观察者)
  3. Java并发编程(6):Runnable和Thread实现多线程的区别(含代码)
  4. 数据中心机房布线设计方案
  5. linux stack
  6. 解决:RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB
  7. 【ARM】一步一步移植Linux Kernel 2.6.13到板子
  8. 文献记录(part73)--基于 PCA 的信息压缩 : 从一阶到高阶
  9. 服务器皮肤在哪个文件里,服务器怎么使用皮肤
  10. 同等学力申硕计算机科学与技术参考书,2017同等学力申硕计算机科学与技术综合备考规划...
  11. 利用yii2 gridview实现批量删除案例
  12. JAVA中注解controller_SpringMVC之基于注解的Controller
  13. 【堆】这是要搞事情啊——取出
  14. shell学习之跳出循环
  15. jQuery实现textarea高度根据内容自适应
  16. 如何下载可爱随意字体KISS ME
  17. 【庄碰辉】物质与精神的对垒中选择
  18. VSCode常用插件和字体设置
  19. 运动目标检测之帧差法
  20. 【离散椭圆弧】将椭圆弧按弧长等分为一定数量弧上点

热门文章

  1. 软件需求分析详细说明
  2. 微信模板推送-详情页跳转
  3. A Quick Overview of MSAA
  4. 考研数学 张宇 —— 三重积分笔记(第十八讲 [1] 手写记录)
  5. 数字后端基本概念介绍Utilization
  6. 简单了解下linux与windows两者的区别-行云管家
  7. 施密特正交化_机器学习 线性代数基础 | 3.3施密特正交化:寻找最佳投影基
  8. 输入一个三位数,输出个位十位百位
  9. 泛微ecology 选择框的查询
  10. ChatGLM2发布!中文榜单开源模型排名第一!8-32k上下文,推理提速42%