如何使用JavaFaker生成模拟数据
创始人
2024-03-21 04:36:26
0

1. 概述

JavaFaker是一个库,可用于生成从地址到流行文化参考的各种真实数据。

在本教程中,我们将研究如何使用JavaFaker的类来生成假数据。我们将首先介绍Faker类和FakeValueService,然后继续介绍区域设置以使数据更特定于单个位置。

最后,我们将讨论数据的独特性。为了测试 JavaFaker 的类,我们将使用正则表达式,您可以在此处阅读有关它们的更多信息。

2. 依赖关系

下面是开始使用JavaFaker所需的单个依赖项。

首先,基于 Maven 的项目需要的依赖关系:

com.github.javafakerjavafaker0.15

对于 Gradle 用户,您可以将以下内容添加到build.gradle文件中:

compile group: 'com.github.javafaker', name: 'javafaker', version: '0.15'

3.假价值服务

FakeValueService类提供了用于生成随机序列以及与区域设置关联的 resolveving.yml文件的方法。

在本节中,我们将介绍FakerValueService必须提供的一些有用方法。

3.1.字母化、数字化和两者化

三种有用的方法是LetterifyNumberifyBothifyLetterify有助于生成字母字符的随机序列

接下来,Numerify只是生成数字序列。

最后,Bothify是两者的结合,可以创建随机的字母数字序列 - 对于模拟ID字符串之类的东西很有用。

FakeValueService需要一个有效的语言环境,以及一个随机服务:

@Test
public void whenBothifyCalled_checkPatternMatches() throws Exception {FakeValuesService fakeValuesService = new FakeValuesService(new Locale("en-GB"), new RandomService());String email = fakeValuesService.bothify("????##@gmail.com");Matcher emailMatcher = Pattern.compile("\\w{4}\\d{2}@gmail.com").matcher(email);assertTrue(emailMatcher.find());
}

在这个单元测试中,我们创建了一个新的FakeValueService,其语言环境为en-GB,并使用bothify方法生成一个唯一的假Gmail地址

它通过替换“?”来工作用随机字母和'#'用随机数。然后,我们可以通过简单的Matcher检查来检查输出是否正确。

3.2. 注册

同样,正则表达式基于所选正则表达式模式生成随机序列

在此代码段中,我们将使用FakeValueService在指定的正则表达式之后创建一个随机序列:

@Test
public void givenValidService_whenRegexifyCalled_checkPattern() throws Exception {FakeValuesService fakeValuesService = new FakeValuesService(new Locale("en-GB"), new RandomService());String alphaNumericString = fakeValuesService.regexify("[a-z1-9]{10}");Matcher alphaNumericMatcher = Pattern.compile("[a-z1-9]{10}").matcher(alphaNumericString);assertTrue(alphaNumericMatcher.find());
}

我们的代码创建一个长度为 10 的小写字母数字字符串。我们的模式根据正则表达式检查生成的字符串。

4. JavaFaker的Faker

Faker允许我们使用 JavaFaker 的假数据类

在本节中,我们将了解如何实例化Faker对象并使用它来调用一些假数据:

Faker faker = new Faker();String streetName = faker.address().streetName();
String number = faker.address().buildingNumber();
String city = faker.address().city();
String country = faker.address().country();System.out.println(String.format("%s\n%s\n%s\n%s",number,streetName,city,country));

上面,我们使用Faker 地址对象来生成一个随机地址

当我们运行此代码时,我们将得到一个输出示例:

3188
Dayna Mountains
New Granvilleborough
Tonga

我们可以看到数据没有单一的地理位置,因为我们没有指定区域设置。为了改变这一点,我们将在下一节中学习使数据与我们的位置更相关。

我们也可以以类似的方式使用这个faker对象来创建与更多对象相关的数据,例如:

  • 啤酒
  • 食物
  • 电话号码

您可以在此处找到完整列表。

5. 介绍语言环境

在这里,我们将介绍如何使用区域设置使生成的数据更特定于单个位置。我们将介绍具有美国区域设置和英国区域设置的伪造者

@Test
public void givenJavaFakersWithDifferentLocals_thenHeckZipCodesMatchRegex() {Faker ukFaker = new Faker(new Locale("en-GB"));Faker usFaker = new Faker(new Locale("en-US"));System.out.println(String.format("American zipcode: %s", usFaker.address().zipCode()));System.out.println(String.format("British postcode: %s", ukFaker.address().zipCode()));Pattern ukPattern = Pattern.compile("([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|"+ "(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y]" + "[0-9]?[A-Za-z]))))\\s?[0-9][A-Za-z]{2})");Matcher ukMatcher = ukPattern.matcher(ukFaker.address().zipCode());assertTrue(ukMatcher.find());Matcher usMatcher = Pattern.compile("^\\d{5}(?:[-\\s]\\d{4})?$").matcher(usFaker.address().zipCode());assertTrue(usMatcher.find());
}

在上面,我们看到具有区域设置的两个Faker与国家/地区邮政编码的正则表达式匹配。

如果传递给Faker的区域设置不存在,Faker将抛出LocaleDoesNotExistException

我们将使用以下单元测试对此进行测试:

@Test(expected = LocaleDoesNotExistException.class)
public void givenWrongLocale_whenFakerInitialised_testExceptionThrown() {Faker wrongLocaleFaker = new Faker(new Locale("en-seaWorld"));
}

6. 独特性

虽然JavaFaker看似随机生成数据,但无法保证其唯一性

JavaFaker支持以RandomService的形式为其伪随机数生成器(PRNG)设定种子,以提供重复方法调用的确定性输出。

简单地说,伪随机性是一个看似随机但不是的过程。

我们可以通过创建两个具有相同种子的Faker来了解其工作原理:

@Test
public void givenJavaFakersWithSameSeed_whenNameCalled_CheckSameName() {Faker faker1 = new Faker(new Random(24));Faker faker2 = new Faker(new Random(24));assertEquals(faker1.name().firstName(), faker2.name().firstName());
}

上面的代码从两个不同的伪造者返回相同的名称。

7. 结论

在本教程中,我们探索了JavaFaker 库来生成真实的假数据。我们还介绍了两个有用的类:Faker类和FakeValueService类。

我们探讨了如何使用区域设置来生成特定于位置的数据。

最后,我们讨论了如何生成的数据看起来只是随机的,并且不能保证数据的唯一性。

像往常一样,代码片段可以在GitHub上找到。

相关内容

热门资讯

被骗至缅甸男模特已获救 #中国驻泰使领再次提醒高薪工作陷阱#【#被骗至缅甸男模特已获救#】 据中国驻泰国大使馆消息:在各方共...
港股异动 | 中资券商股午后走...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 中资券商股午后走高,...
上个公厕转账14次?男子以为发... 转自:法制日报浙江杭州的林先生怎么也没想到上个厕所也能被骗……不久前正在逛街的林先生突然想上个厕所遂...
阿里拟发行120亿港元零息可换... #阿里健康大跌6.42%#【#阿里拟发行120亿港元零息可换债券#,或变相减持引发阿里健康大跌】7月...
A股银行板块市值年内涨超2万亿... 用牛市思维看待和参与本轮银行股重大级别行情,当下不是行情的下半场,而是长周期的开始,趋势的力量(低利...
乌称俄发射超500架无人机 主... 当地时间7月4日,乌克兰空军通报称自3日18时起,俄军从库尔斯克、沙塔洛沃、奥廖尔、布良斯克、罗斯托...
北京预计未来8天都有雨,气象专... 新京报讯(记者王景曦)近日,包括北京在内的华北平原地区遭遇了同期少见的高温闷热天气。北京频繁降雨、闷...
宇树科技IPO或“箭在弦上” 中经记者 李昆昆 李正豪 北京报道近期,浙江宇树科技股份有限公司完成股份制改造,引发市场对其IPO进...
权威发布|山东出台5方面23条... 转自:山东发布今天上午,山东省人民政府新闻办公室举行省政府政策例行吹风会,邀请省委宣传部、省科技厅负...
“北京西城·高校发展联盟”高校... 转自:北京日报客户端7月3日,“北京西城·高校发展联盟”高校路演日启动仪式暨哈尔滨工程大学专场路演在...