
文章目录Datafaker给 Java 项目灌假数据的轻量工具1、 解决什么问题2、 装起来3、 上手即用4、 几个进阶玩法表达式集合与流Schema 转换唯一值自定义 Provider5、 Locale 支持6、 Native Image7、 谁适合用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 项目里加一段依赖dependencygroupIdnet.datafaker/groupIdartifactIddatafaker/artifactIdversion2.7.0/version/dependencyGradle 项目改一行implementationnet.datafaker:datafaker:2.7.0想追主线更新的可以试试2.8.0-SNAPSHOT每次 push 到 main 分支会自动发到 sonatype 的 snapshots 仓库。3、 上手即用最小可用代码就这么多FakerfakernewFaker();Stringnamefaker.name().fullName();// Miss Samanta SchmidtStringfirstNamefaker.name().firstName();// EmoryStringlastNamefaker.name().lastName();// BartonStringstreetAddressfaker.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” 出来。或者用 JBangjbang -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 抽象。CsvTransformerNametransformerCsvTransformer.Namebuilder().header(true).separator(,).build();SchemaName,StringfromScratchSchema.of(field(firstName,()-faker.name().firstName()),field(lastname,()-faker.name().lastName()));System.out.println(transformer.generate(fromScratch,2));// firstName,lastname// Kimberely,Considine// Mariela,KrajcikJSON 同理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 Image2.4.1 版本起有实验性的 native-image 支持。META-INF 里配reachability-metadata.json目前靠跑单测加 agent 收集 tracing 信息手工生成-agentlib:native-image-agentconfig-output-dirsrc/main/resources/META-INF/native-image能用 GraalVM 编 native 的话这块值得试。出问题乐意提 issue作者明确说了这是实验性功能。7、 谁适合用写 Java 或 Kotlin 后端、需要往开发环境数据库里灌假数据的人做演示需要看起来真实的展示数据的人写单元测试需要构造 fixture 的人做 RAG 灌库前需要造测试语料的人。Python 那边有fakerPHP 那边有fakerRuby 那边也有fakerJava 阵营里 Datafaker 是更新最勤的一个。原版 java-faker 已经停在老 Java 上不维护了新项目不建议再选。Python 那边有fakerPHP 那边有fakerRuby 那边也有fakerJava 阵营里 Datafaker 是更新最勤的一个。原版 java-faker 已经停在老 Java 上不维护了新项目不建议再选。