前言
在开发过程中,自测过程中。通常都是把参数固定了,做单元测试生成数据都是一样的,缺乏真实性。希望能尽量生成一些真实数据,查阅了点资料发现还是有些不错的框架。
jmockdata
java-faker
mockJs(一个前端js框架,java也可以调用js)
一起来玩玩,用起来吧!!!
1 jmockdata
源码地址:GitHub - jsonzou/jmockdata: The plugin to mock the java data by random.
贴上github上一段描述
Jmockdata是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。
插件通过随机算法模拟Java数据.
- 支持丰富多样的数据类型模拟,包括:Java基本类型、字符串、枚举、日期、数组、多维数组、集合[List|Set|Map]、枚举、Java对象等
- 支持通过正则表达式反向模拟数据
- 支持泛型
- 支持继承
- 支持循环依赖、自依赖(手动开启enabledCircle)
- 支持忽略字段
- 支持改变mockConfig来自定义模拟数据策略
- 支持自定义Mocker类扩展数据模拟类型
- 支持添加BeanMocker拦截器类改变模拟行为
- 支持JDK1.8+
hello word 起来
引入依赖
<dependency>
<groupId>com.github.jsonzou</groupId>
<artifactId>jmockdata</artifactId>
<version>4.3.0</version>
</dependency>
支持以下基础类型直接模拟
描述 | 类型 |
---|---|
基础类型 | byte boolean char short int long float double |
包装类型包装 | Byte Boolean Character Short Integer Long Float Double |
常用类型 | BigDecimal BigInteger Date LocalDateTime LocalDate LocalTime java.sql.Timestamp String Enum |
多维数组 | 以上所有类型的多维数组 如:int[] int[][] int[][][] .... etc. |
//基本类型模拟
int intNum = JMockData.mock(int.class);
int[] intArray = JMockData.mock(int[].class);
Integer integer = JMockData.mock(Integer.class);
Integer[] integerArray = JMockData.mock(Integer[].class);
//常用类型模拟
BigDecimal bigDecimal = JMockData.mock(BigDecimal.class);
BigInteger bigInteger = JMockData.mock(BigInteger.class);
Date date = JMockData.mock(Date.class);
String str = JMockData.mock(String.class);
模拟bean,被模拟的数据最好是plain bean,通过反射给属性赋值。
支持模拟继承而来的属性。
@Data
public class Person {
private String name;
private Integer age;
private String email;
}
public static void main(String[] args) {
Person person= JMockData.mock(Person.class);
System.out.println(JSON.toJSONString(person));
}
上面就能轻松的生成一个对象,但是打印出结果。感觉数据还是很假,不是我想要的。
人的年龄怎么可能上千岁,黑山老妖了吗?邮箱格式也不合法。那么能不能尽量生成真实一些,答案当然是可以,说干就干。
public static void main(String[] args) {
MockConfig mockConfig =
new MockConfig()
.subConfig("age")
// 设置 int 的范围
.intRange(1, 100)
.subConfig("email")
// 设置生成邮箱正则
.stringRegex("[a-z0-9]{5,15}\\@\\w{3,5}\\.[a-z]{2,3}")
.globalConfig();
Person person = JMockData.mock(Person.class, mockConfig);
System.out.println(JSON.toJSONString(person));
}
似乎真实了那么点哈。
2 Java Faker
源码地址:GitHub - DiUS/java-faker: Brings the popular ruby faker gem to Java
java faker 有个亮点支持国际化,这个感觉还是很棒的。可以生成自己想要的数据
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
</dependency>
public static void main(String[] args) {
Faker faker = new Faker(Locale.CHINA);
Name name = faker.name();
System.out.println("name : " + name.name());
Address address=faker.address();
System.out.println("streetAddress : " +address.streetAddress());
}
3 java 调用mockJs
mockJs:Home · nuysoft/Mock Wiki · GitHub
https://cdn.bootcss.com/Mock.js/1.0.1-beta3/mock-min.js
直接上代码
public static void main(String[] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
String scriptString = FileUtils.readFileToString(new File("d:\\tmp\\mock-min.js"));
engine.eval(scriptString);
Object result = engine.eval("Mock.Random.boolean()");
System.out.println(result);
result = engine.eval("Mock.Random.county(true)");
System.out.println(result);
result = engine.eval("Mock.Random.cname()");
System.out.println(result);
result = engine.eval("Mock.Random.img()");
System.out.println(result);
result = engine.eval("Mock.Random.email()");
System.out.println(result);
}