Master Test Data Generation with DataFaker in Spring Boot 3 – Real‑World Examples
This article introduces the open‑source DataFaker library for Java, shows how to add it to a Spring Boot 3.4.2 project, and provides step‑by‑step code examples for generating personal, address, collection, enum, SQL, CSV, and localized test data, including schema transformers and expression support.
1. Introduction
High‑quality test data is essential for reliable software testing, yet manually crafted data often lacks realistic business semantics and is costly to maintain. The article presents DataFaker, a modern evolution of JavaFaker, designed for the JVM ecosystem (Java, Kotlin, Scala) and offering an extensive, extensible API.
2. Adding DataFaker to a Spring Boot Project
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.5.2</version>
</dependency>2.1 Basic Usage
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);2.2 Internationalization Support
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);Running with Locale.CHINA yields Chinese‑style names such as:
fullName: 巫伟祺
firstName: 熠彤
username: 博文.戚2.3 Random Enum Values
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);Example output:
day1: FRIDAY, day2: SATURDAY2.4 Generating Collections
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);Possible result:
[姬, 烨伟, 立轩, 狄] List<Object> objects = faker.<Object>collection(
() -> faker.name().firstName(),
() -> faker.random().nextInt(100))
.maxLen(5)
.generate();
System.err.println(objects);Possible result:
[89, 36, 56, 鸿煊, 伟泽]2.5 Null‑Value Injection
List<Object> objects = faker.<Object>collection(
() -> faker.name().firstName(),
() -> faker.random().nextInt(100))
.nullRate(0.3)
.maxLen(5)
.generate();Running may produce:
[null, null, 73, 姣姣, 修杰]2.6 Schema and Transformers
Define a schema that maps field names to data generators:
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 output using CsvTransformer:
CsvTransformer<String> transformer = CsvTransformer.<String>builder()
.header(true)
.separator(",")
.quote('\0')
.build();
String csv = transformer.generate(schema, 10);SQL output using SqlTransformer (MySQL dialect):
Schema<String, Object> schema = Schema.of(
field("name", () -> faker.name().firstName()),
field("age", () -> faker.number().numberBetween(1, 100)),
field("phone", () -> faker.phoneNumber().phoneNumber()));
SqlTransformer<String> sqlTran = new SqlTransformer.SqlTransformerBuilder<String>()
.batch(5)
.tableName("t_user")
.dialect(SqlDialect.MYSQL)
.build();
String sql = sqlTran.generate(schema, 10);
System.err.println(sql);Sample INSERT statements are produced, demonstrating how DataFaker can directly generate ready‑to‑run SQL scripts.
2.7 Expression Support
Faker faker = new Faker();
faker.expression("#{letterify 'test????test'}"); // → testqwastest
faker.expression("#{numerify '#test#'}"); // → 3test5
faker.expression("#{regexify '[a-z]{4,10}'}"); // → wbevoa
// JSON, CSV and other complex structures can also be generated via expressions.3. Conclusion
DataFaker provides a powerful, type‑safe way to generate realistic test data for Java applications. It supports basic primitives, collections, localized data, schema‑driven transformations to CSV, SQL, JSON, and custom expressions, making it a valuable tool for backend developers working with Spring Boot.
Spring Full-Stack Practical Cases
Full-stack Java development with Vue 2/3 front-end suite; hands-on examples and source code analysis for Spring, Spring Boot 2/3, and Spring Cloud.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
