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

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

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


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


TestableMock 简介

TestableMock 开源地址:


https://github.com/alibaba/testable-mockimage.pngTestableMock 在 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 使用较为复杂,而且由于使用的是自定义类加载器技术,所以也还会存在一定的问题。


下面来看下具体对比:image.pngTestableMock 和 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 系列教程,非常齐全。

增加一个类,调用任意方法、成员方法、静态方法:image.png增加单元测试类:

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";
    }
    @Test
    void commonMethodTest() {
        assertEquals("http://www.javastack.cn_false", testableMock.commonMethod());
        verify("trim").withTimes(1);
        verify("substr").withTimes(1);
        verify("startsWith").withTimes(1);
    }
    @Test
    void 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/

版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。


近期热文推荐:


1.Java 15 正式发布, 14 个新特性,刷新你的认知!!


2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!


3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。


4.吊打 Tomcat ,Undertow 性能很炸!!


5.《Java开发手册(嵩山版)》最新发布,速速下载!


觉得不错,别忘了随手点赞+转发哦!


image.png

相关文章
一文读懂Can总线错误处理
一文读懂Can总线错误处理
一文读懂Can总线错误处理
|
3月前
|
人工智能 数据可视化 机器人
OpenClaw快速部署指南:官方镜像一键部署,两步拥有专属AI助理!
OpenClaw(“小龙虾”)是开源强执行AI智能体,能像真人一样操作电脑、执行命令、处理文件。阿里云官方镜像一键部署,新用户首月仅9.9元,配免费Token,零代码两步即用!本地优先保隐私,3000+技能开箱即用。
492 2
|
5月前
|
SQL 关系型数据库 MySQL
深入浅出:图解淘宝分布式数据库TDDL(及开源替代方案)
TDDL(淘宝分布式数据层)是阿里自研的数据库中间件,支持分库分表、读写分离与分布式事务,历经多年演进并开源。其核心通过SQL解析、智能路由、重写与结果聚合,透明化处理海量数据与高并发,兼容MySQL协议,助力系统线性扩展与高可用。(239字)
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【8月更文挑战第5天】随着互联网应用规模增长,性能测试至关重要。本文介绍如何利用Python结合Apache JMeter和Locust构建高效可定制的性能测试框架。JMeter广泛用于负载测试,通过模拟大量虚拟用户并发访问来评估性能。Locust基于Python,通过编写简单脚本模拟HTTP请求,特别适合Web应用测试,比JMeter更灵活易扩展。Python作为胶水语言简化测试脚本编写并流畅自动化流程。文章提供JMeter命令行测试和Locust脚本示例,并展示如何用Python自动化执行和整合测试结果,最终帮助应用在高负载下稳定运行。
476 1
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
36426 1
|
人工智能 安全 测试技术
探索AI在软件开发中的应用:提升开发效率与质量
【10月更文挑战第31天】在快速发展的科技时代,人工智能(AI)已成为软件开发领域的重要组成部分。本文探讨了AI在代码生成、缺陷预测、自动化测试、性能优化和CI/CD中的应用,以及这些应用如何提升开发效率和产品质量。同时,文章也讨论了数据隐私、模型可解释性和技术更新等挑战。
|
索引
如何避免 IDEA 每次重启都index
在 IntelliJ IDEA 中,可以通过以下几个步骤来避免每次重启时索引: 打开 File -> Settings 菜单。在左侧的菜单栏中选择 “Appearance & Behavior” -> “System Settings” -> “Synchronization”。
4471 0
|
机器学习/深度学习 监控 算法
量化交易系统开发步骤功能/规则玩法/案例项目/逻辑功能
量化交易策略系统开发是指利用编程和数学模型来设计、开发和实施自动化交易策略的过程。它涉及了将交易策略转化为可编程的算法,以便计算机可以根据预定规则和条件进行自动交易。
|
消息中间件 数据库 微服务
Python进行微服务架构的设计与实现
【6月更文挑战第5天】微服务架构成为软件开发热门,通过拆分小型自治服务提升灵活性、可扩展性和可维护性。Python以其易用性和强大功能,成为实现微服务的理想选择。本文介绍如何利用Python设计和实现微服务,包括: 1. **微服务概述**:解释微服务架构的基本原理,强调松耦合、可伸缩性、灵活性和易维护性等优点。 2. **设计步骤**:确定服务边界、定义接口、实现服务和配置部署。 3. **案例代码**:展示使用Flask实现用户服务和订单服务的简单示例。 4. **代码扩展**:探讨数据持久化、身份验证、异步通信和日志记录等实践。 5. **更多可能性**:讨论服务发现、负载均衡、安全性
|
SQL 关系型数据库 Oracle
sql 截取字符串
原文:sql 截取字符串 MySQL:   1、LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出现的位置,如果字符substr在字符串str中不存在,则返回0;   2、POSITION(substr  IN str ):返回子串 substr 在...
4925 0