1. 概要

JavaFaker は、住所から大衆文化の参照まで、さまざまなリアルなデータを生成するために使用できるライブラリです。

このチュートリアルでは、JavaFakerのクラスを使用して偽のデータを生成する方法を見ていきます。 まず、FakerクラスとFakeValueServiceを紹介してから、ロケールを紹介してデータを1か所に固有のものにします。

最後に、データがどれほどユニークであるかについて説明します。 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 クラスは、localeに関連付けられた.ymlファイルを解決するだけでなく、ランダムシーケンスを生成するためのメソッドを提供します。

このセクションでは、FakerValueServiceが提供する必要のある便利なメソッドのいくつかについて説明します。

3.1. Letterify Numerify 、および Bothify

3つの便利な方法は、 Letterify Numberify 、およびBothifyです。 Letterify は、アルファベット文字のランダムシーケンスを生成するのに役立ちます。

次に、Numerifyは単純に数値シーケンスを生成します。

最後に、 Bothify は2つの組み合わせであり、ランダムな英数字シーケンスを作成できます。これはID文字列などのモックに役立ちます。

FakeValueService には、有効な Locale、 RandomService:が必要です。

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

この単体テストでは、ロケールが en-GBの新しいFakeValueService作成し、bothifyメソッドを使用して一意の偽のGmailアドレスを生成します。

「?」を置き換えることで機能しますランダムな文字と「#」と乱数。 次に、単純なMatcherチェックで出力が正しいことを確認できます。

3.2. Regexify

同様に、 regexifyは、選択された正規表現パターンに基づいてランダムシーケンスを生成します。

このスニペットでは、 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));

上記では、FakerAddressオブジェクトを使用してランダムアドレスを生成します。

このコードを実行すると、出力の例が表示されます。

3188
Dayna Mountains
New Granvilleborough
Tonga

ロケールを指定しなかったため、データには単一の地理的位置がないことがわかります。 これを変更するために、次のセクションでデータを現在の場所により関連性のあるものにする方法を学習します。

このfakerオブジェクトを同様の方法で使用して、次のようなさらに多くのオブジェクトに関連するデータを作成することもできます。

  • 仕事
  • ビール
  • 食べ物
  • 電話番号

完全なリストはここにあります。

5. ロケールの紹介

ここでは、ロケールを使用して、生成されたデータを単一の場所により具体的にする方法を紹介します。 米国ロケールと英国ロケールの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());
}

上記では、ロケールを持つ2つの Fakers が、国の郵便番号の正規表現と一致していることがわかります。

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)のシードをサポートし、繰り返されるメソッド呼び出しの決定論的な出力を提供します。

簡単に言えば、疑似ランダム性はランダムに見えるプロセスですが、そうではありません。

同じシードで2つのFakersを作成することで、これがどのように機能するかを確認できます。

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

上記のコードは、2つの異なる偽造者から同じ名前を返します。

7. 結論

このチュートリアルでは、 JavaFakerライブラリを調べて、実際に見える偽のデータを生成しました。 また、FakerクラスとFakeValueServiceクラスの2つの便利なクラスについても説明しました。

ロケールを使用して場所固有のデータを生成する方法を検討しました。

最後に、生成されたデータがランダムにしか見えず、データの一意性が保証されない方法について説明しました。

いつものように、コードスニペットはGitHubにあります。