Faker Api未返回特定国家/地区的地址

时间:2019-07-06 21:30:01

标签: java faker

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

Faker API使用资源来生成数据。 我浏览了美国地区的资源:https://github.com/DiUS/java-faker/blob/master/src/main/resources/en-US.yml,但没有找到使用hereaddress.country_code路径。

您的问题已得到解释here

  

存在一个问题,该问题是由于该语言环境的数据不足所致。因此,如果没有特定于该语言环境的数据,则所有语言环境都将默认为英语语言环境。因此,国家/地区会查找法语数据,但如果该数据不存在,它将使用英语。

如果您有权访问语言环境,则应使用语言环境中的国家/地区代码。