Datafaker:给 Java 项目灌假数据的轻量工具
文章目录
Datafaker:给 Java 项目灌假数据的轻量工具
Datafaker 在 GitHub 上拿了 1.7K Star。
这是个 Java 假数据生成库,从 java-faker 分叉而来,用 Java 17 重写了一遍底层,加了不少新的生成器。地址、姓名、日期、金融、医疗、电影、动漫……扫一遍它的 provider 列表,从 AWS、Azure 到 Harry Potter、Star Wars,再到巴西的 CNPJ 和 CPF,能想到的字段基本都有人写好了。

1、 解决什么问题
写新项目的时候,演示页面里那串 “test123”、“张三”、“111111” 看着就寒碜。开发阶段要造数据,要么手敲,要么写一段 SQL 往表里塞,要么从生产环境脱敏一份出来。前两种累,后一种有合规风险。
Datafaker 把这件事压成一行代码。faker.name().fullName() 出来一个 “Miss Samanta Schmidt”,faker.address().streetAddress() 出来 “60018 Sawayn Brooks Suite 449”。看起来像真数据,实际上一行调用就完事。
顺带提一句,Kotlin 也能用,API 完全一致。
2、 装起来
Maven 项目里加一段依赖:
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.7.0</version>
</dependency>
Gradle 项目改一行:
implementation 'net.datafaker:datafaker:2.7.0'
想追主线更新的,可以试试 2.8.0-SNAPSHOT,每次 push 到 main 分支会自动发到 sonatype 的 snapshots 仓库。
3、 上手即用

最小可用代码就这么多:
Faker faker = new Faker();
String name = faker.name().fullName(); // Miss Samanta Schmidt
String firstName = faker.name().firstName(); // Emory
String lastName = faker.name().lastName(); // Barton
String streetAddress = faker.address().streetAddress();
Kotlin 版几乎一模一样,把 Faker() 写成 val faker = Faker() 就行。
JShell 玩具也支持。从项目根目录跑 jshell --class-path $(ls -d target/*.jar | tr '\n' ':'),进去就能 var faker = new Faker() 然后 faker.address().city() 拿一个 “Brittneymouth” 出来。或者用 JBang:jbang -i net.datafaker:datafaker:2.7.0,连项目都不用建。
4、 几个进阶玩法
单纯生成单字段是基础。下面这些是日常应用里更常用的形态。
表达式
字符串模板里嵌假数据,letterify、numerify、templatify、examplify、regexify 各管一摊。比如 #{letterify 'test????test'} 出 “testqwastest”,#{regexify '[a-z]{4,10}'} 出 “wbevoa”。
更狠的是 #{csv ...} 和 #{json ...},一行表达式直接吐出 CSV 或 JSON 字符串,省掉自己拼结构。
集合与流
要批量数据,faker.collection(...).len(3, 5).generate() 出一个 List。要无限流,faker.stream(...).generate() 拿一个 Stream,喂给下游消费就行。
Schema 转换
这是更工程化的一块。定义一个 Schema,字段配 Supplier 或 Function,然后交给 CsvTransformer、JsonTransformer 吐成对应格式。从零生成可以,从已有对象列表抽字段再转格式也行。两种用法共用一套 Schema 抽象。
CsvTransformer<Name> transformer =
CsvTransformer.<Name>builder().header(true).separator(",").build();
Schema<Name, String> fromScratch =
Schema.of(field("firstName", () -> faker.name().firstName()),
field("lastname", () -> faker.name().lastName()));
System.out.println(transformer.generate(fromScratch, 2));
// "firstName","lastname"
// "Kimberely","Considine"
// "Mariela","Krajcik"
JSON 同理,JsonTransformer.builder().build() 一拿就能用。YAML、XML 在文档里有更多例子。
唯一值
faker.unique().fetchFromYaml("music.instruments") 这一系列调用保证一个值不被取两次,灌数据库主键或者唯一约束字段的时候有用。
自定义 Provider
官方没覆盖到的领域,照着文档写个 provider 接到 Faker 上,调用方式跟内置的一致。
5、 Locale 支持
new Faker(Locale.of("en", "US")) 这种构造可以指定语言和国家。美国加州邮编、阿尔巴尼亚身份证号、摩尔多瓦手机号,能精确到这种粒度。
文档里列了 60 多种 locale,从阿拉伯语到越南语,主流的都有。需要本地化数据测试的场景,这块够用。
6、 Native Image
2.4.1 版本起有实验性的 native-image 支持。META-INF 里配 reachability-metadata.json,目前靠跑单测加 agent 收集 tracing 信息手工生成:
-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image
能用 GraalVM 编 native 的话,这块值得试。出问题乐意提 issue,作者明确说了这是实验性功能。
7、 谁适合用
写 Java 或 Kotlin 后端、需要往开发环境数据库里灌假数据的人;做演示需要看起来真实的展示数据的人;写单元测试需要构造 fixture 的人;做 RAG 灌库前需要造测试语料的人。
Python 那边有faker,PHP 那边有faker,Ruby 那边也有faker,Java 阵营里 Datafaker 是更新最勤的一个。原版 java-faker 已经停在老 Java 上不维护了,新项目不建议再选。
Python 那边有faker,PHP 那边有faker,Ruby 那边也有faker,Java 阵营里 Datafaker 是更新最勤的一个。原版 java-faker 已经停在老 Java 上不维护了,新项目不建议再选。
更多推荐

所有评论(0)