🎉🎉《Spring Boot实战案例合集》目前已更新194个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
在软件开发与测试过程中,生成高质量测试数据是保障系统稳定性和业务正确性的核心需求。传统方式依赖手动编写固定测试用例或简单随机字符串,但存在显著痛点:数据缺乏真实业务语义(如无效地址、格式错误的ID),难以覆盖复杂场景(如多语言、地区化规则);同时,维护成本高昂,尤其是跨团队协作时,测试数据易因业务变更失效。
本篇文章我们将介绍一款开源的组件DataFaker。DataFaker(https://www.datafaker.net/)是JavaFaker库的现代演进版本,专为JVM生态系统(Java、Kotlin、Scala)从零设计。它提供了丰富可扩展API。
<dependency><groupId>net.datafaker</groupId><artifactId>datafaker</artifactId><version>2.5.2</version></dependency>
Faker faker = new Faker();// 生成个人姓名信息String fullName = faker.name().fullName();System.err.printf("fullName: %s%n", fullName);String firstName = faker.name().firstName();System.err.printf("firstName: %s%n", firstName);String username = faker.credentials().username();System.err.printf("username: %s%n", username);String password = faker.credentials().password();System.err.printf("password: %s%n", password);String email = faker.internet().emailAddress();System.err.printf("email: %s%n", email);String ipv4 = faker.internet().ipV4Address();System.err.printf("ipv4: %s%n", ipv4);String macAddress = faker.internet().macAddress();System.err.printf("macAddress: %s%n", macAddress);String phoneNumber = faker.phoneNumber().phoneNumber();System.err.printf("phoneNumber: %s%n", phoneNumber);// 生成地址信息String streetAddress = faker.address().streetAddress();System.err.printf("streetAddress: %s%n", streetAddress);String city = faker.address().city();System.err.printf("city: %s%n", city);String zipCode = faker.address().zipCode();System.err.printf("zipCode: %s%n", zipCode);String country = faker.address().country();System.err.printf("country: %s%n", country);String companyName = faker.company().name();System.err.printf("companyName: %s%n", companyName);String jobTitle = faker.job().title();System.err.printf("jobTitle: %s%n", jobTitle);
基础类(日常数据提供程序)
娱乐类(电影、节目、书籍相关数据提供程序)
食品类(各类食品相关数据提供程序)
体育类(各类体育相关数据提供程序)
电子游戏类(电子游戏相关数据提供程序)
要使用 Datafaker 处理不同区域设置,您可以在构造函数中提供区域设置参数,如下示例:
Faker faker = new Faker(Locale.CHINA) ;String fullName= faker.name().fullName();System.err.printf("fullName: %s%n", fullName) ;String firstName= faker.name().firstName();System.err.printf("firstName: %s%n", firstName) ;String username= faker.credentials().username() ;System.err.printf("username: %s%n", username) ;
在构造函数中指定Locale,运行结果:
fullName: 巫伟祺firstName: 熠彤username: 博文.戚
2.3 随机枚举值
要从 Java 枚举中获取随机值,可以使用 Options.option() 方法。以下示例假设你需要从 Day 枚举中获取随机值。
public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}Faker faker = new Faker() ;Options opt= faker.options();Day day1 = opt.option(Day.class) ;Day day2 = opt.option(Day.class) ;System.err.printf("day1: %s, day2: %s%n", day1, day2);
运行结果
day1: FRIDAY, day2: SATURDAY
2.4 生成集合数据
如下示例,将生成一个包含名字和姓氏的List集合,其中元素数量介于3到5之间:
Faker faker = new Faker(Locale.CHINA);List<String> names = faker.collection(() -> faker.name().firstName(),() -> faker.name().lastName()).len(3, 5).generate();System.err.println(names);
运行结果
[姬, 烨伟, 立轩, 狄]
生成不同类型数据
List<Object> objects =faker.<Object>collection(() -> faker.name().firstName(),() -> faker.random().nextInt(100)).maxLen(5).generate() ;System.err.println(objects) ;
运行结果
[]
生成带有null的值
List<Object> objects = faker.<Object>collection(() -> faker.name().firstName(),() -> faker.random().nextInt(100)).nullRate(0.3).maxLen(5).generate() ;
[null, null, 73, 姣姣, 修杰]
Schema是一组规则,用于描述如何将数据从Datafaker的表示形式转换为其支持的某种格式。Schema主要优势之一在于,同一Schema可用于转换为不同的格式。Schema有两种使用方式:既可用于从头生成数据,也可用于转换现有数据。如下示例定义Schema:
Faker faker = new Faker(Locale.CHINA) ;Schema<String, String> schema = Schema.of(field("first_name", () -> faker.name().firstName()),field("last_name", () -> faker.name().lastName()),field("address", () -> faker.address().streetAddress()));
// 以Csv格式输出CsvTransformer<String> transformer = CsvTransformer.<String>builder().header(true).separator(",").quote('\0').build() ;// 生成10条数据String csv = transformer.generate(schema, 10) ;
Schema<String, Object> schema = Schema.of(field("name", () -> faker.name().firstName()),field("age", () -> faker.number().numberBetween(1, 100)),field("age", () -> faker.number().numberBetween(1, 100)),field("phone", () -> faker.phoneNumber().phoneNumber()));SqlTransformer<String> sqlTran =newSqlTransformer.SqlTransformerBuilder<String>().batch(5).tableName("t_user").dialect(SqlDialect.MYSQL).build();String sql = sqlTran.generate(schema, 10);System.err.println(sql) ;
INSERT INTO t_user (name, age, age, phone)VALUES ('豪', 35, 94, '0871 9524 6228'),('语堂', 88, 8, '0433 10056'),('烨华', 28, 81, '0769 1066 1100'),('擎苍', 13, 32, '0737 005 3997'),('凯瑞', 85, 40, '010 1645 6841');INSERT INTO t_user (name, age, age, phone)VALUES ('鸿煊', 78, 3, '080 78123'),('烨霖', 73, 19, '0413 10028'),('苑博', 26, 66, '024 6983 4965'),('睿渊', 54, 7, '0435 10029'),('哲瀚', 11, 83, '010 12345');
Faker faker = new Faker();faker.expression("#{letterify 'test????test'}"); // testqwastestfaker.expression("#{numerify '#test#'}"); // 3test5faker.expression("#{templatify 'test','t','q','@'}"); //@esqfaker.expression("#{examplify 'test'}"); // ghjkfaker.expression("#{regexify '[a-z]{4,10}'}"); // wbevoafaker.expression("#{options.option '23','2','5','$','%','*'}"); // *faker.expression("#{date.birthday 'yy DDD hh:mm:ss'}"); //61327 08:11:45faker.expression("#{csv '1','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}");//"name_column","last_name_column"// "Sabrina","Kihn"faker.expression("#{json 'person','#{json ''first_name'',''#{Name.first_name}'',''last_name'',''#{Name.last_name}''}','address','#{json ''country'',''#{Address.country}'',''city'',''#{Address.city}''}'}");// {"person": {"first_name": "Barbie", "last_name": "Durgan"}, "address": {"country": "Albania", "city": "East Catarinahaven"}}
强大!Spring Boot 9个宝藏注解,提升你的代码水平
告别手写SQL!Spring AI 智能生成+执行,效率提升1000%
高级开发!一个注解简化Spring Boot本地消息表(Outbox)实现
自定义@Proxy注解!Spring Boot 动态控制代理功能,真的很强大
JSON处理不再头疼!Jackson Tree模型解锁JSON操作的开挂模式
优化!高并发下 Spring Boot 乐观锁 + 悲观锁性能调优
JdbcTemplate已过时?Spring6.1新特性JdbcClient流畅链式API
必备开发技能!基于Spring Boot各种场景下的数据类型转换技巧


