# 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 ```