java数据随机初始化&bean随机初始化

jupiter
2023-08-21 / 0 评论 / 38 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年08月21日,已超过242天没有更新,若内容或图片失效,请留言反馈。

0.背景

最近在开发一个web小demo,其中进行数据测试需要对一些字段特别多的java bean进行初始化,一番百度之后查找到了几个解决方案,记录如下。

1.Jpopulator

1.1 pom依赖

<dependency>
    <groupId>io.github.benas</groupId>
    <artifactId>jpopulator</artifactId>
    <version>1.0.1</version>
</dependency>

1.2 使用方式及测试

  • 实体类
import lombok.Data;
@Data
public class Person {
    private int id;
    private String name;
    private String gender;
}
  • 测试代码
@Test
public void testJpopulator(){
    Populator populator = new PopulatorBuilder().build();
    Person person = (Person) populator.populateBean(Person.class);
    System.out.println(person);
    List<Person> persons = populator.populateBeans(Person.class, 2);
    System.out.println(persons);
}
Person(id=-1042426959, name=nOBdJpkFbB, gender=bCwLDjOxXb)
[Person(id=813095571, name=zxDkvjecWM, gender=SztfWBTZEj), Person(id=1664076867, name=ckMadNdfcX, gender=qmxsXZOiOI)]

2.PODAM

2.1 pom依赖

<dependency>
    <groupId>uk.co.jemos.podam</groupId>
    <artifactId>podam</artifactId>
    <version>7.1.1.RELEASE</version>
</dependency>

2.2 使用方式及测试

  • 实体类
import lombok.Data;
@Data
public class Person {
    private int id;
    private String name;
    private String gender;
}
  • 基本使用
@Test
public void testPodam(){
    PodamFactory factory = new PodamFactoryImpl();
    Person person = factory.manufacturePojo(Person.class);
    System.out.println(person);
}
Person(id=1889825458, name=s6tv8LgsPD, gender=zY5put8aZT)

2.3 进阶自定义数据生成策略

比较复杂,不推荐。

参考文档:Java Unit Tests make easy - Random Values with PODAM (onloadcode.com)

3.common-random

参考文档:https://github.com/yindz/common-random

支持的数据类型:

  • 数字(int/long/double)
  • 汉字(简体)
  • 邮箱地址
  • 中文人名(简体)
  • 英文人名
  • 虚拟身份证号码(中国大陆)
  • 虚拟信用卡号码(Visa/Mastercard/JCB/银联/AmericanExpress)
  • 手机号码(中国大陆)
  • 省份和城市(中国大陆)
  • 邮编(中国大陆)
  • 联系地址(中国大陆)
  • 车牌号(中国大陆,包括新能源车型)
  • 域名
  • 静态URL
  • 日期(特定日期之前/特定日期之后)
  • 时间(过去/未来)
  • 时间戳
  • 强密码
  • 网络昵称(登录名)
  • 拼音网络昵称(登录名)
  • IPv4地址
  • 端口号
  • QQ号码
  • 非主流QQ网名
  • 学历
  • 小学名称、年级、班级
  • 中学名称、年级、班级
  • 高校名称(数据取自教育部网站)
  • 公司名称
  • 经纬度(中国)
  • 中文短句
  • User-Agent(PC/Android/iOS)
  • 网卡MAC地址
  • RGB颜色值
  • HEX颜色值
  • 股票名称+股票代码
  • 开放式基金名称+基金代码

缺点:

  • 只能逐一生成单个的随机字段,数据、生成对象需要逐一对对象的属性进行填充吗。
  • 对于字段较多的对象生成比较麻烦

4.Jmockdata(★★★)(推荐)

支持类型:

  • Java基本类型
  • 字符串
  • 枚举
  • 日期
  • 数组
  • 多维数组
  • 集合[List|Set|Map]
  • Java对象

4.1 pom依赖

<dependency>
    <groupId>com.github.jsonzou</groupId>
    <artifactId>jmockdata</artifactId>
    <version>4.2.0</version>
</dependency>

4.2 Java常用类型的生成

@Test
public void testJmockdata(){
    int randomInt =  JMockData.mock(int.class);
    long randomLong = JMockData.mock(long.class);
    double randomDouble = JMockData.mock(double.class);
    float randomFloat = JMockData.mock(float.class);
    String randomString = JMockData.mock(String.class);
    BigDecimal randomBigDecimal = JMockData.mock(BigDecimal.class);

    System.out.println("randomInt:"+randomInt);
    System.out.println("randomLong:"+randomLong);
    System.out.println("randomDouble:"+randomDouble);
    System.out.println("randomFloat:"+randomFloat);
    System.out.println("randomString:"+randomString);
    System.out.println("randomBigDecimal:"+randomBigDecimal);
}
randomInt:1116
randomLong:6722
randomDouble:1303.83
randomFloat:9700.79
randomString:cggMvc
randomBigDecimal:3029.8

4.3 对象的生成

  • 实体类
@Data
public class Student {
    private int id;
    private String name;
    private int age;
    private LocalDateTime createTime;
}
  • 生成测试数据
@Test
public void testJmockdata(){
    Student student1 = JMockData.mock(Student.class);
    System.out.println("默认生成策略生成结果:"+student1);

    //按照规则定义Student对象里面单个字段生成,没配置的就按默认的生成邪恶了
    MockConfig mockConfig = new MockConfig()
        .subConfig("id").intRange(1,10)
        .subConfig("name").subConfig("[a-zA-Z_]{1}[a-z0-9_]{5,15}")
        .subConfig("age").intRange(18,21)
        .globalConfig();
    Student student2 = JMockData.mock(Student.class,mockConfig);
    System.out.println("自定义生成策略生成结果:"+student2);
}
  • 执行结果
默认生成策略生成结果:Student(id=7105, name=s, age=9755, createTime=2039-09-15T13:53:47.294)
自定义生成策略生成结果:Student(id=1, name=akXrp, age=18, createTime=2050-12-04T07:05:53.299)

4.4 根据正则模拟数据

配合4.3共同完成对象属性的初始化。

/**
* 根据正则模拟数据
* 正则优先于其他规则
*/
@Test
public void testRegexMock() {
    MockConfig mockConfig = new MockConfig()
        // 随机段落字符串
        .stringRegex("I'am a nice man\\.And I'll just scribble the characters, like:[a-z]{2}-[0-9]{2}-[abc123]{2}-\\w{2}-\\d{2}@\\s{1}-\\S{1}\\.?-.")
        // 邮箱
        .subConfig(RegexTestDataBean.class,"userEmail")
        .stringRegex("[a-z0-9]{5,15}\\@\\w{3,5}\\.[a-z]{2,3}")
        // 用户名规则
        .subConfig(RegexTestDataBean.class,"userName")
        .stringRegex("[a-zA-Z_]{1}[a-z0-9_]{5,15}")
        // 年龄
        .subConfig(RegexTestDataBean.class,"userAge")
        .numberRegex("[1-9]{1}\\d?")
        // 用户现金
        .subConfig(RegexTestDataBean.class,"userMoney")
        .numberRegex("[1-9]{2}\\.\\d?")
        // 用户的得分
        .subConfig(RegexTestDataBean.class,"userScore")
        .numberRegex("[1-9]{1}\\d{1}")
        // 用户身价
        .subConfig(RegexTestDataBean.class,"userValue")
        .numberRegex("[1-9]{1}\\d{3,8}")
        .globalConfig();
}

参考资料

  1. Jpopulator测试数据生成工具-腾讯云开发者社区-腾讯云 (tencent.com)
  2. Podam 一个Pojo填充随机值利器_这个程序员像只猴的博客-CSDN博客
  3. jmockdata: Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。单元测试的利器 (gitee.com)
  4. GitHub - yindz/common-random: 简单易用的随机数据生成器。生成各种比较真实的假数据。一般用于开发和测试阶段的数据填充模拟。支持各类中国特色本地化的数据格式。An easy-to use random data generator. Generally used for data filling, simulation, demonstration and other scenarios in the development and test phase.
  5. JmockData---jfairy 学习记录(生成测试数据)_"小王"的博客-CSDN博客
  6. Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架-面圈网 (mianshigee.com)
0

评论 (0)

打卡
取消