# open4cn-mock
**Repository Path**: open4cn/open4cn-mock
## Basic Information
- **Project Name**: open4cn-mock
- **Description**: 实现对http接口mock的小工具
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-08
- **Last Updated**: 2023-03-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Mock, Java
## README
### 背景
开发过程中,前后端、后后端之间一般都是先定义接口,然后各自开发,等待接口开发完成并部署之后再进行实际联调.
>定义接口 --> 开发接口--> 部署接口 --> 接口联调
### 痛点
结合自身情况,发现在接口定义管理和接口联调的过程中存在一些难点:
(1)针对基于swagger自动生成文档的方式
* 需要先编写controller、dto类,而类命名、方法命名是一件头疼的事情
* controller、dto的类上面耦合了swagger的注解,这些注解甚至还会存在依赖传递问题
* 提交空的controller、dto类会给git上面的代码造成污染,留下无意义的commit
* swagger接口无法动态mock数据
(2)针对基于yapi在线接口管理工具的方式
* 编辑环境不如IDEA流畅
* 自带的mock工具表达式配置复杂
* 高级mock功能等价于编写代码
* 调用方需要切换接口环境
### 思路
1. 使用xml、json、yml描述接口元信息
2. 基于接口元信息,利用javassist技术生成controller,dto类
3. 在系统启动过程中,将生成的controller注入容器
4. 在接口调用时,基于接口元信息动态mock数据并返回
### 功能
1. 支持定义接口
2. 支持请求入参校验
3. 支持生成随机数据
4. 支持字典扩展
5. 支持动态更改接口模型
6. 支持页面化展示接口描述
7. 支持json导出接口描述
8. 支持性能监控
9. 支持导出yapi格式json并导入yapi
10.支持导出postman格式json并导入postman
11.支持自定义片段模型复用
### 细节
1. 每一个接口定义文件代表一个url
2. 通过httpMethod+url保证接口唯一性
3. 接口=path+请求参数+响应参数
4. 字段=属性名+属性类型+校验规则+随机数规则+注释
5. 属性类型 in (Integer,Long,Double,Boolean,Date,List,Class)
6. 校验规则 in (是否必填,最小值,最大值,区间值)
7. 随机数规则 in (默认值,最小值,最大值,区间值,长度,字典集,集合元素数量)
8. 接口的每个部分转成一个模型(InterfaceModel,PathModel,RequestModel,ResponseModel,FieldModel)
### 使用说明
采用maven方式集成,需先配置maven仓库地址
```xml
open4cn-maven
https://gitee.com/open4cn/maven/raw/master
```
以及引入下面依赖
```xml
com.open4cn
mock-spring-boot-starter
0.2.0-SNAPSHOT
```
存在以下配置项以及默认值:
application.properties
```yml
#是否启用mock
open4cn.mock.enabled=false
#是否启用文件校验
open4cn.mock.switch.be-validate=false
#是否采用并行加载
open4cn.mock.switch.load-parallel=false
#字典集是否采用追加模式
open4cn.mock.switch.dict-append=false
#接口定义文件路径
open4cn.mock.path.interface-source=classpath:mock/include
#字典文件路径
open4cn.mock.path.dict-source=classpath:dict
#片段文件路径
open4cn.mock.path.fragment-source=classpath:fragment
```
application.yml
```yml
open4cn:
mock:
enabled: false
switch:
be-validate: false
dict-append: false
load-parallel: false
path:
interface-source: classpath:mock/include
dict-source: classpath:dict
fragment-source: classpath:fragment
```