Mock
一个伪造数据的框架,用来方便随机生成一些数据。
基本用法
引用依赖Maven:
<dependency>
<groupId>com.github.developframework</groupId>
<artifactId>mock-text</artifactId>
<version>${version.mock}</version>
</dependency>
提供一个模板字符串(template),可以内嵌占位符${...}
,占位符将会被随机值替换。
生成一个:
MockClient mockClient = new MockClient();
String result = mockClient.mock("random text: ${ string }");
System.out.println(result);
random text: pXFMyu
批量生成:
List<String> list = mockClient.mock("random text: ${ string }", 5);
list.forEach(System.out::println);
random text: PDsUUg
random text: zcVIFN
random text: YFORrL
random text: rnYSpZ
random text: fCmrto
从输入流引入模板:
String result = mockClient.mock(inputStream, charset);
从输入流引入模板批量生成
List<String> list = mockClient.mock(inputStream, charset, quantity);
占位符
占位符的格式:
${ <type> | [ param1=value1, param2='value2' ] }
- type是占位符的类型
- param=value是可选的参数,对随机值做约束,boolean型的
param=true
可以省略直接写param
- Mock可以自动识别所填参数是什么基本类型,在有歧义的情况下,最好还是用单引号申明字符串值,比如
'1234'
比如:
${ string | length=10, uppercase }
将会生成一个10位长度的全大写的随机字母字符串
目前所有内置的占位符
string
随机字符串
${ string | length=10, letters, numbers, uppercase, lowercase }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
length | 字符串长度 | 6 | ${ string | length=10 } | UvmNUqOACS |
letters | 使用字母 | true | ${ string | letters } | EETnby |
numbers | 使用数字 | false | ${ string | numbers } | 236914 |
uppercase | 使用大写 | false | ${ string | uppercase } | LHKRDU |
lowercase | 使用小写 | false | ${ string | lowercase } | mgpval |
uppercase
和lowercase
都写和都不写时,大小写混合。
number
随机数值
${ number | min=0, max=100, decimals }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
min | 最小值 | 0 | ${ number | min=0 } | 4 |
max | 最大值 | Double.MAX_VALUE | ${ number | min=100 } | 20 |
decimals | 采用小数 | false | ${ number | decimals } | 82.30656374435402 |
digit | 有效位数 | null | ${ number | decimals, digit = 2 } | 91.02 |
fillZero | 整数前面补零 | null | ${ number | fillZero = 4 } | 0096 |
boolean
随机布尔值
${ boolean }
enum
随机枚举值
${ enum | AAA, BBB, CCC }
date
随机日期
${ date | range=1y, pattern=yyyy-MM-dd, future }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
range | 日期范围,相对于系统日期浮动,格式:1y1M1d1h1m1s | 1y | ${ date | range=1y } | 2018-03-20 |
pattern | 日期格式化 | yyyy-MM-dd | ${ date | pattern=yyyy/MM/dd } | 2018/03/20 |
future | 随机一个未来的日期,默认是已过的日期 | false | ${ date | future } | 2018-05-16 |
time
随机时间
${ time | range=1h, pattern=HH:mm:ss, future }
可用参数和date类型一致,区别是pattern
参数默认值是HH:mm:ss, range
的默认值是1h
datetime
随机日期和时间
${ datetime | range=1y, pattern=yyyy-MM-dd HH:mm:ss, future }
可用参数和date类型一致,区别是pattern
参数默认值是yyyy-MM-dd HH:mm:ss
mobile
随机手机号码
${ mobile }
personName
随机人名
${ personName | length=3 }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
length | 名字字数 | 3 | ${ personName | length=3 } | 王悦议 |
onlyName | 只生成名 | false | ${ personName | onlyName } | 悦议 |
address
随机地址
${ address | level=3 }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
level | 地址层数 | 3 | ${ address | level=3 } | 浙江省杭州市富阳区 |
province | 限定省份范围 | null | ${ address | province = 浙江省 } | 浙江省嘉兴市南湖区 |
city | 限定城市范围(要先限定省份才有效) | null | ${ address | province = 浙江省, city = 嘉兴市 } | 浙江省嘉兴市南湖区 |
数据提供器参见独立项目chinese-administrative-region
identityCard
随机身份证号
${ identityCard | birthday-ref=random, range=30y }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
birthday-ref | 生日依赖 | random | ${ personName | birthday-ref=random } | 152028201408159388 |
address-ref | 地区依赖 | random | ${ personName | address-ref=random } | 152028201408159388 |
sex-ref | 性别依赖 | random | ${ personName | sex-ref=FEMALE } | 152028201408159388 |
range | 生日范围 | 30y | ${ identityCard | range=30y } | 914951199607233405 |
String sex = mockClient.mock("sex: ${ enum | id = anySex, MALE, FEMALE }");
String address = mockClient.mock("address: ${ address | id = anyAddress, province = 浙江省, city = 嘉兴市 }");
String birthday = mockClient.mock("birthday: ${ date | id = anyBirthday, range = 30y }");
String identityCard = mockClient.mock("identityCard: ${ identityCard | address-ref = anyAddress, birthday-ref = anyBirthday, sex-ref = anySex }");
sex: FEMALE
address: 浙江省嘉兴市嘉善县
birthday: 1989-08-09
identityCard: 330421198908090074
birthday-ref
可以引用之前出现过的生日日期,生成更加严谨的身份证号address-ref
可以引用之前出现过的地址,生成更加严谨的身份证号
ip
随机IP号
${ ip | prefix = '192.168' }
可用参数 | 说明 | 默认值 | 随机示例 | 示例结果 |
---|---|---|---|---|
prefix | IP前缀网段 | null | ${ ip | prefix = '192.168.1' } | 192.168.1.55 |
这里的prefix
最好使用单引号括起来,避免数字字符串引起类型歧义。
quote
这个类型本身不生成随机值,引用之前已生成的随机值
String firstText = mockClient.mock("first: ${ string | id = first }");
String secondText = mockClient.mock("quote: ${ quote | ref = first }");
System.out.println(firstText);
System.out.println(secondText);
给之前的占位符设置一个id
在后面使用quote类型引用之前的值
first: GtHQra
quote: GtHQra
自定义占位符
继承随机生成器接口com.github.developframework.mock.random.RandomGenerator
// <T> 是随机值的类型
public interface RandomGenerator<T> {
// 描述如何生成随机值
T randomValue(RandomGeneratorRegistry randomGeneratorRegistry, MockPlaceholder mockPlaceholder, MockCache mockCache);
// 识别占位符的名称
String name();
// 描述随机值如何转换到字符串
String forString(MockPlaceholder mockPlaceholder, T value);
}
public class MyRandomGenerator implements RandomGenerator<String>{
@Override
public String randomValue(MockPlaceholder mockPlaceholder, MockCache mockCache) {
// 获得参数
String param = mockPlaceholder.getParameterOrDefault("param", String.class, "default value");
// 返回随机值
return null;
}
@Override
public String name() {
return "myPlaceholder";
}
@Override
String forString(MockPlaceholder mockPlaceholder, T value) {
return value;
}
}
给MockClient注册自定义随机生成器
RandomGenerator[] customRandomGenerators = new RandomGenerator[] {
new MyRandomGenerator()
};
mockClient.getRandomGeneratorRegistry().customRandomGenerators(customRandomGenerators);
Mock-db
给数据库表随机填充数据框架
引用依赖Maven:
<dependency>
<groupId>com.github.developframework</groupId>
<artifactId>mock-db</artifactId>
<version>${version.mock}</version>
</dependency>
提交一条随机数据
DBMockClient client = new DBMockClient(driver, url, user, password);
try {
int count = client.byMysql()
.database("test")
.table("person")
.field("name", "${ personName }")
.field("birthday", "${ date | range=20y }")
.field("mobile", "${ mobile }")
.field("address", "${ address }")
.submit();
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
}
批量提交随机数据:
int count = client.byMysql()
// 忽略表配置
.submit(100);