Datafaker 2.0 的主要变化之一是至少要求 Java 版本 17,类似于 Spring Boot 3.0 等流行框架。此版本的Datafaker显着改进了库的性能、对 Java 记录的支持、生成大量测试数据的能力等等。
Datafaker 最常见的用例是在 Java 中生成随机可读值,例如名字、引号或其他值。
但是,如果您需要生成其他格式的数据(例如 JSON 或 CSV)怎么办?
为此,Datafaker 有一个 Schema 和 Transformer 概念,它们是协同工作的,因此应该一起使用。
我们来看看这个Schema和Transformer是什么以及它们起到什么作用。
架构是一组规则,描述将数据从 Datafaker 格式转换为受支持的格式之一需要执行的操作。模式的主要优点之一是可以使用相同的模式转换为不同的格式。
在 Datafaker 中,每种格式都有自己的Transformer实现。在撰写本文时,Datafaker 支持 6 种格式,这意味着也有六种 Transformer 实现,即:
让我们仔细看看其中一种格式,在本例中为 CSV 格式。
使用CSV 文件时,有时您可能需要创建包含数据的 CSV 文件,例如出于测试目的。手动将数据输入 CSV 文件可能是一个乏味且耗时的过程。您可以使用 Datafaker 等工具以 CSV 格式快速生成所需数量的虚假数据,而不是在手动数据输入上浪费时间和精力。Datafaker 允许您指定所需的行数和列数,并生成可以轻松导出到 CSV 文件的随机数据。在处理大型数据集或测试应用程序并对其进行原型设计时,这尤其有用。
让我们看一个例子:
Faker faker = new Faker(Locale.GERMANY); // Datafaker supports any locale from the Locale package
Schema
执行上面的代码可能得到的结果如下:
"firstName";"lastName";"phoneNumber"
"Jannik";"Ripken";"+49 9924 780126"
"Frederike";"Birkemeyer";"+49 2933 945975"
"Michelle";"Steuk";"+49 7033 814683"
"Ellen";"Semisch";"+49 9537 991422"
"Oskar";"Habel";"+49 3626 169891"
CsvTransformer 构建器还为您提供了几个可供使用的参数,例如:
- quote()
,如果您想更改默认 ( "
) 报价。
- separator()
,在行中分隔列的字符。
-header()
布尔参数,用于切换生成的 CSV 中标头的生成。
除 Java 对象格式外,所有其他五种格式都遵循相同的原理。
让我们看看这个 Java 对象转换有什么特别之处。
JavaObjectTransformer 自 Datafaker 1.8.0 版本起可用。通过在 JavaObjectTransformer 中提供对 Java 记录的支持,Datafaker 2.0 进一步增强了这一点。
总的来说,我们有两种使用 JavaObjectTransformer 的方法:
让我们仔细看看每个选项。第一种使用方法是通过熟悉的 Transformer 和 Schema 对。让我们看一个实际的例子:
请注意,我们使用 Java 17 和 Datafaker 2.0。因此,我们将创建一个Client
具有 3 个属性的 Java 记录:
public record Client(String firstName, String lastName, String phoneNumber) { }
接下来,我们需要为我们的班级提供架构。
Faker faker = new Faker();
JavaObjectTransformer jTransformer = new JavaObjectTransformer();
Schema schema = Schema.of(
field("firstName", () -> faker.name().firstName()),
field("lastName", () -> faker.name().lastName()),
field("phoneNumber", () -> faker.phoneNumber().phoneNumberInternational())
);
System.out.println(jTransformer.apply(Client.class, schema));
我们的程序的结果将如下:
Client{firstName='Elton', lastName='Conroy', phoneNumber='+1 808-239-0480'}
让我们看一下第二个用例,即使用预定义模式填充 Java 对象。
这种方法的本质是重写模式并使用它,而无需每次都显式指定它。
让我们继续看一个实际的例子:
首先,我们需要为模型定义架构。它的定义如下,在我的机器上,位于类com.datafaker
的包中DatafakerSchema
:
public static Schema defaultSchema() {
var faker = new Faker(Locale.UK, new RandomService(new Random(1)));
return Schema.of(
field("firstName", () -> faker.name().firstName()),
field("lastName", () -> faker.name().lastName()),
field("phoneNumber", () -> faker.phoneNumber().phoneNumberInternational())
);
}
然后您应该提供一个类作为生成对象的模板。此类应使用@FakeForSchema
注释进行注释,并将模式方法的路径作为值。
@FakeForSchema("com.datafaker.DatafakerSchema#defaultSchema")
public record Client(String firstName, String lastName, String phoneNumber) { }
然后,您可以使用net.datafaker.providers.base.BaseFaker.populate(java.lang.Class
默认的预定义架构填充对象。
Client client = BaseFaker.populate(Client.class);
或者,您可以使用net.datafaker.providers.base.BaseFaker.populate(java.lang.Class
自定义架构填充对象:
Client client = BaseFaker.populate(Client.class, Schema.of(
field("firstName", () -> faker.name().firstName()),
field("lastName", () -> faker.name().lastName()),
field("phoneNumber", () -> faker.phoneNumber().phoneNumberInternational())
));
populate
是相同的:
Client{firstName='Darrel', lastName='Bogisich', phoneNumber='+44 161-444-6889'}
序列是 Datafaker 的一个引人注目但被低估的功能。想象一下这样一种情况,您只需要一些java.util.List
随机值,或者需要无限的随机数据流。在这种情况下,Datafaker 序列非常适合。但在开始使用它之前,最好了解序列及其类型的详细信息,这就是我们要做的。
Datafaker 支持两种类型的假序列:
FakeCollection 用于生成内存中的假值列表。让我们看一个实际的例子:
Faker faker = new Faker();
List names =
faker.collection(
() -> faker.name().fullName(),
() -> faker.address().city())
.len(2, 6)
.generate();
System.out.println(names);
此代码示例将生成一个假值列表,其中每个元素要么是全名,要么是城市,长度在 2 到 6 个元素之间。这是上面代码的可能结果:
[Pete Nienow, Erik Kub, New Jerrie, Tempie Erdman]
FakeStream 用于生成一系列java.util.stream.Stream
假值。FakeStream 与 FakeCollection 类似。然而,存在一些重要的差异。例如,FakeStream 可以是无限的,并且 FakeStream 的结果是具有生成值的 Stream 对象而不是集合。
想象一下,您需要对持续的数据流进行建模。例如,来自物联网温度传感器的温度。在这种情况下,FakeStream将是正确的选择。让我们看看如何在代码中编写它:
Faker faker = new Faker();
Stream objects =
faker.stream(() -> faker.random().nextDouble(20, 22))
.generate();
objects.forEach(System.out::println);
len(int minLength, int maxLength)
此代码将生成 20 到 22 之间的恒定双精度流。但是,也可以通过or参数指定流的长度len(int length)
。
Faker faker = new Faker();
Stream objects =
faker.stream(() -> faker.random().nextDouble(20, 22))
.len(3, 5)
.generate();
objects.forEach(System.out::println);
可能的结果可能是:
21.663129306577716
20.228104917791825
20.559417738876828
总之,Datafaker 2.0 是对已经令人印象深刻的数据生成库的重大升级。凭借其多样化的数据生成选项和改进的可扩展性,Datafaker 2.0 对于希望生成用于测试和开发目的的真实且多样化的数据的开发人员来说是必不可少的工具。