echohlne / mock-data

非常简单但又高度自定义的数据生成工具

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mock-Data

一个易用但高度自定义的数据生成工具,主要用于测试或是批量数据生成。

适用场景:

  • web场景下生成测试数据测试后台接口
  • 数据库中需要批量插入合规数据
  • 各种场景下的随机数据测试
  • 场景演示下生成随机数据展示

以下内容基于3.x版本,1.x版本请参考 这里,2.x版本请参考 这里

如果还想知道其他的用法,可以看 这里,或是直接查阅 配置说明

特点

  • 上手简单,三行代码即可开始使用
  • 自定义粒度到指定类的指定属性
  • 提供数据池方式,规则式批量填充同类属性
  • 支持绝大多数泛型结构

举例

简单用法

MockDataCreator creator = new MockDataCreator();
// 就像new Random.next一样,随机基础类型的数据
int i = creator.mock(int.class);
// 随机包装类型
int inte = creator.mock(Integer.class);
// 随机数组
int[] ints = creator.mock(int[].class);
// 指定数组大小
int[][] intsArray = creator.mock(new int[2][3]);
// 随机日期
Date date = creator.mock(Date.class);

基础用法

// 创建数据构造器
MockDataCreator creator = new MockDataCreator();
// 获取构造器的当前配置
creator.getConfig()
        // 自动级联构建
        .autoCascade(true)
        // 替换目标对象中已存在的对象,例如基础类型
        .forceNew(true)
// 通过类来实例化对象
Person person = creator.mock(Person.class);
// 或是手动实例化对象,然后填充数据
Person person = new Person();
creator.mock(person);
// 如果你只要其中的某个属性也可以
Pet pet = creator.mock(Person::getPet);

更多用法请参考 使用手册

用法举例

  1. 我想让 person.weight 的范围在3-200之间,person.height 的范围在10-260之间,如何设置?

    MockDataCreator creator = new MockDataCreator();
    creator.getConfig()
         // 开启级联构建并对默认值进行替换
         .autoCascade(true).forceNew(true)
         // 设定weight的范围
         .fieldValue(Person::getWeight, new DoubleRandomCreator(3D, 200D))
         // 设定height的范围
         .fieldValue(Person::getHeight, new DoubleRandomCreator(10D, 260D))
         // 如果需要,也可以设定其他double类型的默认范围
         .fieldValue(double.class, new DoubleRandomCreator(0D, 1000D));
    // 开始构建
    Person person = creator.mock(Person.class);

    上面的三个fieldValue方法的顺序可以随意交换,因为属性绑定的优先级是高于类型绑定的。

  2. 这里有10多个类,但是基本的属性都很相似,如何让其中所有的 address 都填充正规的地址,name 填充正常的名称呢?

    MockDataCreator creator = new MockDataCreator();
    FieldDataPool dataPool = new FieldDataPool()
            // 自动识别同类型属性,包括int类型的所有名称中包含age的属性,忽略大小写,例如age、nominalAge
            .like(Person::getAge, 23, 24, 25, 26, 27)
            .next()
            // 添加FRUIT类的数据池,则会对所有的FRUIT类进行数据池选取,忽略名称
            .type(Person.FRUIT.class)
            .values(Person.FRUIT.APPLE)
            .next()
            // 对Date类的所有名称中能匹配`.*day`和`.*time`的属性进行数据池选取
            .type(Date.class)
            .values(new Date[]{new Date()}, ".*day", ".*time").next();
    // 设置属性数据池
    creator.fieldDataPool(dataPool);
    // 开始构建
    Person person = creator.mock(Person.class);

    更多属性数据池的用法看 这里

支持的类型

基础类型

  • 8个基础属性
    • bytebooleanshortintlongfloatdoublechar
    • ByteBooleanShortIntegerLongFloatDoubleCharacter
  • String
  • 枚举类

常用对象

  • ListSet
  • Map
  • DateLocalDateLocalTimeLocalDateTime
  • BigIntegerBigDecimal

其他

  • 数组
    • 支持任意维度数数组。
    • 通过mock(new T[2][3][4][5])的方式来手动指定数组大小
  • 自定义对象
    • 通过设定autoCascade(true)来自动构建内部属性

注意事项

  • 目前自动构建暂不支持非静态内部类,有需要请使用添加自定义构建器。
  • mock 无法实例化的类(例如接口或是抽象类)时,请给予实例构建器。
  • mock 构建带有泛型但未指明泛型的类时,大概率无法构建成功,请指定泛型类型或实例构建器。
  • 在使用fieldValue(DataCreator)时请勿使用 lambda 表达式,否则会无法识别DataCreator的匹配类型。
    • 例如creator.fieldValue((DataCreator<String>) (cla, field, creator1) -> "String.String")会抛出异常,可以使用匿名内部类表述或通过双参的方法显式指明匹配类型。
  • 对于基础类型(例如int)在进行构建时,其属性是有默认值0的,在没有设定forceNew的情况下会被跳过。

添加依赖

  1. 添加Jitpack仓库源

    maven

    <repositories>
       <repository>
           <id>jitpack.io</id>
           <url>https://jitpack.io</url>
       </repository>
    </repositories>

    Gradle

    allprojects {
      repositories {
          maven { url 'https://jitpack.io' }
      }
    }
    
  2. 添加依赖

    lastVersion

    maven

       <dependencies>
           <dependency>
               <groupId>com.github.Verlif</groupId>
               <artifactId>mock-data</artifactId>
               <version>lastVersion</version>
           </dependency>
       </dependencies>

    Gradle

    dependencies {
      implementation 'com.github.Verlif:mock-data:lastVersion'
    }
    

About

非常简单但又高度自定义的数据生成工具

License:Apache License 2.0


Languages

Language:Java 100.0%