# Mock.java使用说明手册
## 简介
这是一个仿照Mock.js语法的Java语言使用的假数据生成工具框架。
部分方法与类介绍详细可查看JavaDoc文档(推荐先下载下来再看):[JavaDoc文档](helpDoc/index.html)
码云生成的在线javaDoc文档:[在线文档](https://apidoc.gitee.com/ForteScarlet/Mock.java/)
如果存在BUG或者有什么意见、建议,可以通过 issue 进行反馈。
github: [github](https://github.com/ForteScarlet/Mock.java)
gitee : [码云地址](https://gitee.com/ForteScarlet/Mock.java)
此框架中不仅仅只可以作为假数据获取用,还有一些比较实用的工具类可以拿来单独使用。
*工具类介绍:<a href="#工具类介绍">工具类介绍</a>
当前版本:![[maven](https://search.maven.org/artifact/io.gitee.ForteScarlet/mock.java)](https://img.shields.io/maven-central/v/io.gitee.ForteScarlet/mock.java)
最低JDK版本:JDK8
※ 版本更新内容与预期更新计划详见于文档末尾 : <a href="#更新公告">更新公告</a>
# **WIKI**
文档将会开始转移至WIKI处,转移完成后,此处README中的说明性文档将不再更新并择日删除,替换为简单的介绍与demo示例。
**wiki文档:[github wiki](https://github.com/ForteScarlet/Mock.java/wiki) or [gitee wiki](https://gitee.com/ForteScarlet/Mock.java/wikis/pages)**
## 注意
未来2.x版本将会使用与1.x版本不同的包路径。如果迭代版本请注意包路径的修改。
仅为修改包路径,其余内容不变。
如果有2.x的话
<br>
## 友情链接
|项目名称|项目介绍|项目地址|
|---|---|---|
|Mock.JDBC|基于Mock.java与JDBC向数据库插入假数据(暂时停工)|https://github.com/ForteScarlet/Mock.JDBC|
<br>
## 使用方法
### **Maven**
在maven项目下,从pom.xml中导入以下地址:
> 最新版本以maven仓库中的地址为准。仓库地址:`https://mvnrepository.com/artifact/io.gitee.ForteScarlet/mock.java`
```xml
<dependency>
<groupId>io.gitee.ForteScarlet</groupId>
<artifactId>mock.java</artifactId>
<version>${version}</version>
</dependency>
```
### **Gradle**
```gradle
compile group: 'io.gitee.ForteScarlet', name: 'mock.java', version: '${version}'
```
### **Jar**
使用jar包导入的时候,记得同时把作为依赖的`commons-beanutils.commons-beanutils:1.9.3`中的jar包也导入进去。我上传了这些依赖在 [dependencies文件夹](./dependencies) 中。
### **使用**
相信使用过Mock.js的各位大佬应该知道,在使用Mock.js的时候是用的JSON格式的参数。
但是,Java可是没法直接识别JSON的啊!
所以,我们采用最接近JSON格式的方式:**Map集合**。
简单来说,就是将一个类的字段根据Mock.js那样的key-value的键值对转化为一个Map<String, Object>对象就好了!我习惯将这种Map对象称为 *字段映射表* 。
而且作为Java语言,数据类型是必须要多加考虑的问题。我在获取值的时候已经尽可能的增加了容错率,但是还是需要您注意数据类型的问题,请尽可能不要犯下将一个字符串赋值给整数这类难以防范的错误..
或许感觉上比JSON格式的使用要麻烦一些,但是这也是没有办法的事情嘛!假如您有更好的代替方式,希望您能告诉我 :)
### 设置字段映射的方式:
#### 1·创建对象字段与随机值语法的映射关系(Map<String , Object> 类型的键值对)
创建的这个Map,Key值代表了映射的字段名,value值代表了映射语法
由于这毕竟与弱引用类型语言不同,所以在设置映射的时候请务必注意字段的数据类型。
`Map<String, Object> map = new HashMap<>();`
#### 2·添加字段映射
字段映射中,value值所用到的 @函数 可以从 [JavaDoc文档](https://apidoc.gitee.com/ForteScarlet/Mock.java/) 中查阅 [**MockUtil**](https://apidoc.gitee.com/ForteScarlet/Mock.java/com/forte/util/utils/MockUtil.html) 类中的方法,MockUtil中的全部方法均可作为 @函数 出现在value值中。
> **再次提醒,请务必注意对应好字段的字段类型**
```java
map.put("age","@age");
map.put("list|2-3","@title");
map.put("user","@name");
......
```
key值中,有三种写法:
仅有字段映射、字段映射与整数部分区间参数、字段映射、整数部分区间参数与小数部分区间参数。
例如如下这么两个字段映射:
```java
map.put("money1|10-40.2-4" , 0);
map.put("money2|10-40.2" , 0);
```
其中,字段名与区间参数之间的分割符为 **|** 符号,左边为字段名,右半边为区间参数。
区间参数中,整数部分与小数部分用 **.** 符号分割,左半边为整数部分区间参数,右半边为小数部分区间参数。
- ##### 仅有字段映射
任务分配器首先会根据参数(value)的类型分配字段解析器,然后再根据字段类型进行取值。
参数类型有一下几种情况:
- **字符串类型**:如果存在一个或多个@函数,解析@函数并取值,(如果有多个@函数则会尝试对@函数的取值进行加法计算);如果不存在@函数或@函数不存在于MockUtil中的方法列表则将其会视为普通字符串。
- **整数(Integer)、浮点数(Double)类型**:如果参数为Integer或Double类型,则字段值获取器会直接将此值作为默认值赋给字段。
- **数组或集合**:如果参数是数组或集合类型,字段值获取器会从其中随机获取一个值赋予字段。
- **Map集合**:如果参数是Map集合类型,则会对字段的类型进行判断,如果:
- 字段为Map类型,则直接将此Map作为字段值赋予字段,不做处理。
- 字段为List<Map>类型,则字段值获取器会将将此Map集合封装至List集合中并返回。
- 字段为其他任意类型,则任务分配器会将此Map视为此字段类型的字段映射集合进行解析并获取一个实例对象为字段赋值。**(※注:此字段映射同样会被Mock的映射集合记录下来。即嵌套的字段映射不需要单独再进行set了。)**
- **其他任意类型**:如果参数不是上面的任何类型,则字段值获取器会将此参数原样赋值,不做处理。
```java
//假设以下字段映射的是User类
Map<String, Object> map = new HashMap<>();
map.put("age1" , "@age");
map.put("age2" , 15);
map.put("age3" , new Integer(){1,2,3,4});
map.put("name1" , "@name");
map.put("name2" , "@title(2)");
map.put("name3" , "这是一个名字");
//下面三个email字段的参数,如果是中文,必须放在单引号或双引号中才会生效,英文不受限制
map.put("email1" , "@email('这是中文')");
map.put("email2" , "@email('this is english')");
map.put("email3" , "@email(this is english)");
//下面的friend字段的字段类型是一个Friend类,friendMap是对friend字段的映射,也就是嵌套映射
//此friendMap的映射无需单独进行记录
map.put("friend" , friendMap);
//记录映射
Mock.set(User.class, map);
//User类的映射被直接记录,可以获取
MockObject<User> userMockObject = Mock.get(User.class);
//Friend类的映射以嵌套的形式被记录过了,可以直接获取
MockObject<Friend> friendMockObject = Mock.get(Friend.class);
```
- ##### 字段映射与仅整数部分的区间参数
参数类型有一下几种情况:
>
- **字符串类型**:如果存在一个或多个@函数,解析@函数并取值,(如果有多个@函数则会尝试对@函数的取值进行加法计算);在存在@函数的情况下,区间参数将被忽略。
**※ 从`v1.4.2与v1.4.3`之后,当字段类型为Object类型(常见于创建Map类型对象)则会根据区间函数创建范围内大小的List集合。(详细见`v1.4.2与v1