我正在尝试使用com.github.javafaker API编写一些健壮的测试脚本。 API具有特定于语言环境的构造函数,但未返回特定于语言环境国家/地区的地址。
我编写了一个样本Junit来仅测试fakerApi,然后再依靠它来测试我的应用程序。
public class FakerUtils {
public static Faker getFakerByISO3CountryCode(String ISO3CountryCode) {
return SingletonWrapperFaker.countryCodeFakerMap.get(ISO3CountryCode);
}
private static class SingletonWrapperFaker {
static Map<String, Faker> countryCodeFakerMap = new HashMap<>();
static {
Arrays.asList(Locale.getAvailableLocales())
.forEach(locale -> {
try {
countryCodeFakerMap.put(locale.getISO3Country(), new Faker(locale));
}catch(Exception e){
//every locale is not implemented.
}
});
}
}
public static Faker getRandomFaker() {
return null; //TODO: implement it
}
}
测试班
public class FakerUtilsTest {
@Test
public void testGFakerByISO3CountryCode() {
Address address = FakerUtils.getFakerByISO3CountryCode("USA").address();
assertEquals("US",address.countryCode());
}
}
每次返回另一个国家。 我以为API可能只能创建一种对象。 因此,我尝试不使用Fakers填充地图,而只是将区域设置保留在地图中以便快速查找,并在每次getFaker ...()调用时创建了一个基于新区域设置的fakerr对象。但还是没用
调试后更新
我意识到api不能以我以前使用的方式使用。 语言环境仅用于翻译给定语言。 使用locale创建的同一对象(例如Locale.FRANCE)可以返回不同的国家/地区或世界上的任何内容,而与构造函数参数无关。 这是一个非常随机的API,它具有不同的用途。
我在调试会话中的同一对象上调用了.countryCode()。 通过在Faker构造函数中为美国提供语言环境来获取地址对象,但是每次返回新的国家/地区代码时。
address.countryCode()
(java.lang.String) GN
(java.lang.String) LC
(java.lang.String) SH
(java.lang.String) NF
(java.lang.String) BZ
答案 0 :(得分:0)
Faker API使用资源来生成数据。
我浏览了美国地区的资源:https://github.com/DiUS/java-faker/blob/master/src/main/resources/en-US.yml,但没有找到使用here的address.country_code
路径。
您的问题已得到解释here
存在一个问题,该问题是由于该语言环境的数据不足所致。因此,如果没有特定于该语言环境的数据,则所有语言环境都将默认为英语语言环境。因此,国家/地区会查找法语数据,但如果该数据不存在,它将使用英语。
如果您有权访问语言环境,则应使用语言环境中的国家/地区代码。