diff --git a/docs/zh-cn/doc/comparation.md b/docs/zh-cn/doc/comparation.md index e0fef79..1b55522 100644 --- a/docs/zh-cn/doc/comparation.md +++ b/docs/zh-cn/doc/comparation.md @@ -9,7 +9,7 @@ | Spock | 动态代理 | 类 | 不能Mock私有/静态和构造方法 | 较复杂 | 一般 | | PowerMock | 自定义类加载器 | 类 | **任何方法皆可** | 较复杂 | **较好** | | JMockit | 运行时字节码修改 | 类 | 不能Mock构造方法(new操作符) | 较复杂 | 一般 | -| TestableMock | 运行时字节码修改 | 方法 | **任何方法皆可** | **很容易** | 一般 | +| TestableMock | 运行时字节码修改 | 方法 | **任何方法皆可** | **较容易** | **较好** | `Mockito`是Java最老牌的Mock工具,稳定性和易用性较好,IntelliJ和Eclipse都有专用插件支持。相对不足之处在于Mock功能稍弱,在必要情况下需与其他Mock工具配合使用。 @@ -19,8 +19,12 @@ `JMockit`是一款功能性与易用性均居于`Mockito`与`PowerMock`之间的Mock工具,较好的弥补了两者各自的不足。该项目在2017年尝试推出JMockit2重写版本但未能完成,目前处于不活跃的维护状态。 -相比之下,`TestabledMock`的功能与`PowerMock`基本平齐,且极易上手,只需掌握`@MockInvoke`注解就可以完成绝大多数任务。 +相比之下,`TestabledMock`的功能与`PowerMock`基本平齐,且极易上手,只需掌握一个`@MockInvoke`注解就可以完成绝大多数Mock操作。 -当前`TestableMock`的主要不足在于,编写Mock方法时IDE无法即时提示方法参数是否正确匹配。若发现匹配效果不符合预期,需要通过[自助问题排查](zh-cn/doc/troubleshooting.md)文档提供的方法在运行期进行校验。这个功能理论上能够通过扩展主流IDE插件来补充,但目前暂无相关开发计划,参见[Issue-104](https://github.com/alibaba/testable-mock/issues/104)。 +## TestableMock的不足 -此外,由于`TestableMock`独辟蹊径的采用“每个业务类拥有一个专属Mock容器类”的思维方式,将Mock方法定义与单元测试用例解耦,一方面使得Mock方法具有默认可复用性,单元测试用例也因此变得更干净纯粹,另一方面也导致Mock方法定义变得零散,生命周期管理起来相对困难,对现有开发者的Mock编写习惯会带来一定改变。 +为了便于开发者进行Mock工具的合理选型,我们认为客观的强调`TestabledMock`存在的不足,与阐述它的优点同样重要。 + +任何事物都有两面性。由于`TestableMock`独辟蹊径采用“每个业务类拥有一个专属Mock容器类”的思维方式,将Mock方法定义与单元测试用例解耦,一方面使得Mock方法具有默认可复用性,单元测试用例也因此变得更干净纯粹,另一方面也导致Mock方法定义变得零散,生命周期管理起来相对困难,对现有开发者的Mock编写习惯会带来一定改变。 + +此外,`TestableMock`最初的设计主要面向标准单元测试场景(每个类有自己的测试用例,测试类与被测类基本逐一对应)。为了最大限度的提升易用性,把需要用到的注解、操作步骤都减少到最少,`TestableMock`采用了许多“约定优于配置”的设计。譬如被测量、测试类与Mock容器类在同一包路径,且分别按约定命名等。对于单元测试较规范的项目而言,`TestableMock`将极大降低Mock引入的成本;对于规范不足的项目,依然可以结合`@MockWith`、包路径映射等功能完成相同的Mock效果,但应当尤其注意这些“花哨”的功能对代码可读性和可维护性带来的负面影响。 diff --git a/docs/zh-cn/doc/use-intellij-plugin.md b/docs/zh-cn/doc/use-intellij-plugin.md index c1bc9a3..bc470c2 100644 --- a/docs/zh-cn/doc/use-intellij-plugin.md +++ b/docs/zh-cn/doc/use-intellij-plugin.md @@ -1,2 +1,46 @@ -使用IntelliJ插件 +使用IntelliJ IDEA插件 --- + +在使用`TestableMock`工具的过程中经常涉及一些固定操作,比如定义Mock容器类、复制需Mock的调用定义并创建Mock方法,在执行测试时若发现Mock匹配的效果不符合预期,则需要通过[自助问题排查](zh-cn/doc/troubleshooting.md)方法在运行期进行校验。通过IDE插件辅助,能够将部分模式化的操作自动完成,进一步优化`TestableMock`的使用体验。 + +目前`TestableMock`提供了 [IntelliJ IDEA](https://www.jetbrains.com/idea/) 的插件支持(根据JRebel发布的 [2020](https://www.jrebel.com/blog/2020-java-technology-report#IDE) 和 [2021](https://www.jrebel.com/blog/2021-java-technology-report) Java技术趋势报告,IntelliJ IDEA已成为Java开发者使用比例最高的首选IDE)。 + +## 使用方法 + +打开配置项,在插件市场中搜索“Testable-Mock”,选中`Testable-Mock Helper`插件,点击“安装”,然后重启IDE。 + +![install](https://img.alicdn.com/imgextra/i2/O1CN013twjqN2803NVtvJEP_!!6000000007869-0-tps-2342-566.jpg) + +#### 1. **创建Mock容器类** + +安装完插件后,在任意Java类点击右键,点击“生成Testable测试类”(英文版为“Generate Testable TestClass”) + +![mock-class](https://img.alicdn.com/imgextra/i1/O1CN01gNsunh21jfVufv6EU_!!6000000007021-0-tps-546-291.jpg) + +在项目`test`目录下与当前类相同的包路径位置会自动生成一个包含Mock容器类的测试类(已`当前类+Test`命名)。 + +#### 2. **创建Mock方法** + +选中任意方法调用,点击右键,点击“复制方法为Testable-Mock”(英文版为“Copy Testable Mock-Method”)或“复制Testable-Mock方法到测试类”(英文版为“Copy Mock-Method To TestClass”) + +![mock-method](https://img.alicdn.com/imgextra/i4/O1CN01K38Zsh1NrNYLlrUZ9_!!6000000001623-0-tps-642-264.jpg) + +前者会将被选中调用的方法签名,并转换为Mock方法定义存放到剪贴板;后者则会将转换好的Mock方法直接插入到相应的Mock类里。 + +## 源码构建 + +除了通过插件市场安装,也可以直接从源码构建`Testable-Mock Helper`插件。 + +本地准备JDK 11环境,然后执行以下命令: + +```text +git clone https://github.com/zcbbpo/testable-idea +cd testable-idea +./gradlew clean build +``` + +构建完成后,在`build/distributions/`目录下可以找到构建好的插件zip包,通过“从本地磁盘安装”菜单加载该插件。 + +![from-local](https://img.alicdn.com/imgextra/i3/O1CN01YMHefk26MNS4pH4ZI_!!6000000007647-0-tps-2342-516.jpg) + +在此,特别感谢 @[zcbbpo](https://github.com/zcbbpo) 对`TestableMock`IntelliJ IDEA插件的贡献。