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

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

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

阿里 Mock 工具正式开源,干掉市面上所有 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 工具正式开源,干掉市面上所有 Mock 工具】上面所列的主流的 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 系列教程 , 非常齐全 。


推荐阅读