«1. Обзор

JavaFaker — это библиотека, которую можно использовать для создания широкого массива реальных данных, от адресов до отсылок к популярной культуре.

В этом руководстве мы рассмотрим, как использовать классы JavaFaker для создания поддельных данных. Мы начнем с представления класса Faker и FakeValueService, а затем перейдем к введению локалей, чтобы сделать данные более специфичными для одного места.

Наконец, мы обсудим, насколько уникальны данные. Для тестирования классов JavaFaker мы будем использовать регулярные выражения, подробнее о них можно прочитать здесь.

2. Зависимости

Ниже приведена единственная зависимость, которая нам понадобится для начала работы с JavaFaker.

Во-первых, зависимость, которая нам понадобится для проектов на основе Maven:

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
    <version>0.15</version>
</dependency>

Для пользователей Gradle вы можете добавить следующее в свой файл build.gradle:

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

3. FakeValueService ~~ ~ Класс FakeValueService предоставляет методы для генерации случайных последовательностей, а также разрешения файлов .yml, связанных с локалью.

В этом разделе мы рассмотрим некоторые полезные методы, которые может предложить FakerValueService.

3.1. Letterify, Numerify и Bothify

Три полезных метода: Letterify, Numberify и Bothify. Letterify помогает генерировать случайные последовательности буквенных символов.

Далее Numerify просто генерирует числовые последовательности.

Наконец, Bothify представляет собой комбинацию этих двух и может создавать случайные буквенно-цифровые последовательности — полезно для имитации таких вещей, как строки идентификаторов.

Для FakeValueService требуется допустимая локаль, а также RandomService:

В этом модульном тесте мы создаем новую FakeValueService с локалью en-GB и используем метод Bothify для создания уникального поддельного адреса Gmail. .

@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());
}

Это работает, заменяя ‘?’ со случайными буквами и «#» со случайными числами. Затем мы можем проверить правильность вывода с помощью простой проверки Matcher.

3.2. Regexify

Точно так же regexify генерирует случайную последовательность на основе выбранного шаблона регулярного выражения.

В этом фрагменте кода мы будем использовать FakeValueService для создания случайной последовательности, следующей за указанным регулярным выражением:

Наш код создает строчную буквенно-цифровую строку длиной 10. Наш шаблон проверяет сгенерированную строку на соответствие заданному регулярному выражению. регулярное выражение

@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());
}

4. Класс Faker JavaFaker

Класс Faker позволяет нам использовать поддельные классы данных JavaFaker.

В этом разделе мы увидим, как создать экземпляр объекта Faker и использовать его для вызова некоторых поддельных данных:

Выше мы использовали объект Faker Address для генерации случайного адреса.

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));

Когда мы запустим этот код, мы получим пример вывода:

Мы видим, что данные не имеют единого географического местоположения, поскольку мы не указали локаль. Чтобы изменить это, мы научимся делать данные более релевантными нашему местоположению в следующем разделе.

3188
Dayna Mountains
New Granvilleborough
Tonga

Мы также могли бы использовать этот фейкер-объект аналогичным образом для создания данных, относящихся ко многим другим объектам, таким как:

Business Beer Food PhoneNumber

    Полный список можно найти здесь.

5. Знакомство с локалями

Здесь мы расскажем, как использовать локали, чтобы сделать генерируемые данные более специфичными для одного местоположения. Мы представим Faker с локалью для США и локалью для Великобритании:

Выше мы видим, что два Faker с локалью соответствуют своим регулярным выражениям для почтовых индексов стран.

@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 генерирует исключение LocaleDoesNotExistException.

Мы проверим это с помощью следующего модульного теста:

6. Уникальность

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

Хотя JavaFaker, по-видимому, генерирует данные случайным образом, уникальность не может быть гарантирована.

JavaFaker поддерживает заполнение своего генератора псевдослучайных чисел (PRNG) в форме RandomService для обеспечения детерминированного вывода повторяющихся вызовов метода.

Проще говоря, псевдослучайность — это процесс, который кажется случайным, но таковым не является.

Мы можем увидеть, как это работает, создав двух мошенников с одним и тем же начальным числом:

Приведенный выше код возвращает одно и то же имя от двух разных мошенников.

@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.

«