回想平时我们测试,需要数据就在数据库一顿猛操作也没达到所谓的乱数假文,但是Faker很好的为我们解决了这个问题,伪造的数据接近真实数据。但是我们也不能每次都去一个一个数据的生成,这样会叠加代码量,工作量也增加了,于是写了一个工具类,将faker相关的方法以及方法需要的参数和参数类型存入了数据库中,前端只要配置好相对应的数据就能生成伪造数据
githup地址
泛型+反射
用法为:Faker.**.**
Faker faker = Faker.instance(Locale.CHINA);//.instance(Locale.CHINA)指定为中文
//默认英语,如下:
//Faker faker = new Faker();
//生成数据(生成随机电话号码)
//faker.phoneNumber().phoneNumber();
System.err.println("生成的随机电话号码为:"+faker.phoneNumber().phoneNumber());
Faker支持多种语言,80+个基础方法,约500种假数据类型(480种左右,记不清楚了,写入数据库就知道了),详情请看githup地址
生成的随机电话号码为:11132037344
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
</dependency>
数据库字段以及字段类型由于是测试,可根据实际需求修改。
utilFaker,主要用于存入Faker一级二级方法(faker.phoneNumber().cellPhone())一级为phoneNumber()二级为cellPhone()
util_faker_parameterinfo主要是存入最终方法的参数以及参数类型
如faker.number().randomDouble(int maxNumberOfDecimals, int min, int max)三个int类型的参数,参数主要是设置默认参数
@Data
public class MockItem{
/**
* @ 名称对应的faker一级方法.二级方法(number.randomDigit)
*/
private String methodNames;
/**
* @ 生成数据调用方法对应的参数,前段传入的参数
*/
public List inParameters;
/**
* @ 返回数据时的key
*/
private String key;
}
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MockItemParamters {
/**
* @ 名称对应Params参数
*/
private Object Params;
/**
* @ 名称对应Params参数类型
*/
Class> clazz;
}
public class GenerateData{
/**
* TODO
* @param: faker
* @param: mockItem 生成数据是调用的方法,方法需要的参数及类型以及输出数据时的key
* @param: number 生成假数据的条数
* @param: clazz 需要输出的实体
*/
public static List generatList(Faker faker, List mockItem, int number, Class clazz) throws Exception {
List listResult = new ArrayList<>();
for(int i = 0; i < number; i++){
listResult.add(i,generateEntity(faker,mockItem,clazz));
}
return listResult;
}
public static List
输入的参数~~~~~~~~~~~~~~~~~[MockItem(methodNames=name.fullName, inParameters=null, key=name), MockItem(methodNames=number.randomDouble, inParameters=[MockItemParamters(Params=2, clazz=int), MockItemParamters(Params=2, clazz=int), MockItemParamters(Params=99, clazz=int)], key=value)]
根据实体映射输出的10条结果~~~~~~**实体类名称~~~~~~~~~~~[**(name=苏梓晨, value=39.76), **(name=叶昊然, value=47.0), **(name=张笑愚, value=67.61), **(name=黎峻熙, value=77.59), **(name=覃彬, value=14.1), **(name=贺展鹏, value=8.53), **(name=覃致远, value=77.93), **(name=谢煜城, value=35.23), **(name=孙风华, value=29.26), **(name=赖志泽, value=15.06)]
输出的10条Map结果~~~~~~~~~~~~~~~~~[{name=崔天磊, value=78.89}, {name=邱思聪, value=44.28}, {name=陆伟宸, value=57.53}, {name=宋远航, value=19.53}, {name=曾炫明, value=82.85}, {name=周鹏飞, value=82.98}, {name=谭文博, value=78.05}, {name=陈瑾瑜, value=15.98}, {name=史明辉, value=56.29}, {name=尹正豪, value=13.07}]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
根据自己框架把 super.save修改为自己的插入数据的方法即可(insert语句)
public void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Faker faker = Faker.instance( Locale.CHINA);
Field[] fileds = faker.getClass().getDeclaredFields();
for( Field f1:fileds ){
UtilFakerPO utilFakerPO = new UtilFakerPO();
utilFakerPO.setCreateTime(new Date());
utilFakerPO.setEhName(f1.getName());
utilFakerPO.setMthod(f1.getName());
utilFakerPO.setParentId(0l);
super.save(utilFakerPO);
UtilFakerParameterinfoVo details = ConvertUtils.convertIgnoreNull(utilFakerPO, UtilFakerParameterinfoVo.class);
if(!"fakeValuesService".equals(f1.getName())){
String name = f1.getName();
if("randomService".equals(f1.getName())){
name = "random";
}else if("dateAndTime".equals(f1.getName())){
name = "date";
}
Object object = faker.getClass().getMethod(name).invoke(faker);
Method[] methods = object.getClass().getDeclaredMethods();
for (Method method:methods){
String methodName = method.getName();
UtilFakerPO utilFakerchild = new UtilFakerPO();
utilFakerchild.setCreateTime(new Date());
utilFakerchild.setEhName(methodName);
utilFakerchild.setMthod(name+"."+methodName);
utilFakerchild.setParentId(details.getId());
super.save(utilFakerchild);
UtilFakerParameterinfoVo detailschild = ConvertUtils.convertIgnoreNull(utilFakerchild, UtilFakerParameterinfoVo.class);
Class>[] parameterTypes = method.getParameterTypes();
for (Class> clas:parameterTypes){
String parameterName = clas.getSimpleName();
UtilFakerParameterinfoPO utilFakerParameterinfoPO = new UtilFakerParameterinfoPO();
utilFakerParameterinfoPO.setCreateTime(new Date());
utilFakerParameterinfoPO.setDataType(parameterName);
utilFakerParameterinfoPO.setUtilFakerId(detailschild.getId());
super.save(utilFakerParameterinfoPO);
}
}
}
}
};
上面代码中类型转换与参数转换应该有更好的办法,我暂时没有查到,如果大神有更好的方法求指教,写下这篇文章纯属为了学习,记录。同时也希望能给他人提供帮助。