【发布时间】:2019-07-06 21:30:01
【问题描述】:
我正在尝试使用 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 有一个限制,只能创建一种类型的对象。 因此,我尝试不使用 Faker 填充地图,而只是将语言环境保留在地图中以便快速查找,并在每次 getFaker...() 调用时创建一个新的基于语言环境的 faker 对象。但还是不行
调试后更新
我意识到 api 并不打算以我使用的方式使用。 语言环境只是翻译给定语言。 使用语言环境创建的同一对象,例如 Locale.FRANCE 可以返回不同的国家/地址或世界上的任何内容,而与构造函数参数无关。 这是一个非常随机的 API,它有不同的用途。
我在调试会话中对同一对象调用了 .countryCode()。 我通过在 Faker 构造函数中为 USA 提供语言环境来获得地址对象,但每次返回一个新的国家代码时。
address.countryCode()
(java.lang.String) GN
(java.lang.String) LC
(java.lang.String) SH
(java.lang.String) NF
(java.lang.String) BZ
【问题讨论】: