mirror of
https://github.com/alibaba/testable-mock.git
synced 2026-08-19 09:43:29 +08:00
doc: add intellij plugin usage
This commit is contained in:
@@ -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效果,但应当尤其注意这些“花哨”的功能对代码可读性和可维护性带来的负面影响。
|
||||
|
||||
@@ -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。
|
||||
|
||||

|
||||
|
||||
#### 1. **创建Mock容器类**
|
||||
|
||||
安装完插件后,在任意Java类点击右键,点击“生成Testable测试类”(英文版为“Generate Testable TestClass”)
|
||||
|
||||

|
||||
|
||||
在项目`test`目录下与当前类相同的包路径位置会自动生成一个包含Mock容器类的测试类(已`当前类+Test`命名)。
|
||||
|
||||
#### 2. **创建Mock方法**
|
||||
|
||||
选中任意方法调用,点击右键,点击“复制方法为Testable-Mock”(英文版为“Copy Testable Mock-Method”)或“复制Testable-Mock方法到测试类”(英文版为“Copy Mock-Method To TestClass”)
|
||||
|
||||

|
||||
|
||||
前者会将被选中调用的方法签名,并转换为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包,通过“从本地磁盘安装”菜单加载该插件。
|
||||
|
||||

|
||||
|
||||
在此,特别感谢 @[zcbbpo](https://github.com/zcbbpo) 对`TestableMock`IntelliJ IDEA插件的贡献。
|
||||
|
||||
Reference in New Issue
Block a user