JavaのEasyRandomのクイックガイド

  • Java

  • link:/category/testing/ [テスト]

1. 概要

このチュートリアルでは、https://github.com/j-easy/easy-random [EasyRandom]ライブラリを使用してJavaオブジェクトを生成する方法を示します。

2. イージーランダム

場合によっては、テスト目的で使用するモデルオブジェクトのセットが必要です。 または、使用するデータをテストデータベースに追加する必要があります。 次に、クライアントに送り返すためのダミーDTOのコレクションが必要な場合があります。
そのようなオブジェクトを1つ、2つ、またはいくつか設定するのは、複雑でなければ簡単です。 しかし、手動セットアップで手を汚さずに、すぐに数百個必要になる場合があります。
https://github.com/j-easy/easy-random[EasyRandom]がステップインします。 EasyRandomは、使いやすく、セットアップがほとんど不要で、クラスタイプをバイパスするだけのライブラリです。オブジェクトグラフ全体をインスタンス化してくれます。*
それがどれほど簡単か見てみましょう。

3. Mavenの依存関係

まず、https://mvnrepository.com/artifact/org.jeasy/easy-random-core/4.0.0 [the _easy-random-core_ Mavenの依存関係]を_pom.xml_に追加します。
<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-random-core</artifactId>
    <version>4.0.0</version>
</dependency>

4. オブジェクト生成

ライブラリ内の2つの最も重要なクラスは次のとおりです。
  • オブジェクトを生成する_EasyRandom_

  • _EasyRandomParameters_生成を構成できます
    処理し、より予測可能にします。

4.1. 単一オブジェクト

最初の例では、ネストされたオブジェクト、コレクション、_Integer_、および2つの_Strings_を持たない単純なランダム_Person_オブジェクトを生成します。
  • nextObject(Class <T> t) *を使用してオブジェクトの1つのインスタンスを生成しましょう:

@Test
void givenDefaultConfiguration_thenGenerateSingleObject() {
    EasyRandom generator = new EasyRandom();
    Person person = generator.nextObject(Person.class);

    assertNotNull(person.getAge());
    assertNotNull(person.getFirstName());
    assertNotNull(person.getLastName());
}
これは、生成後のオブジェクトの外観です。
Person[firstName='eOMtThyhVNLWUZNRcBaQKxI', lastName='yedUsFwdkelQbxeTeQOvaScfqIOOmaa', age=-1188957731]
ご覧のとおり、生成された文字列は長すぎる可能性があり、年齢は負です。 これをどのように調整できるかについては、以降のセクションで説明します。

4.2. オブジェクトのコレクション

さて、_Person_オブジェクトのコレクションが必要だとしましょう。 別のメソッド_objects(Class <T> t、int size)_を使用すると、そうすることができます。
良いことは、オブジェクトのストリームを返すことです。したがって、最終的には、*中間操作*を追加するか、必要に応じてグループ化できます。
_Person_ *の5つのインスタンスを生成する方法は次のとおりです。
@Test
void givenDefaultConfiguration_thenGenerateObjectsList() {
    EasyRandom generator = new EasyRandom();
    List<Person> persons = generator.objects(Person.class, 5)
        .collect(Collectors.toList());

    assertEquals(5, persons.size());
}

4.3. 複雑なオブジェクトの生成

_Employee_クラスを見てみましょう。
public class Employee {
    private long id;
    private String firstName;
    private String lastName;
    private Department department;
    private Collection<Employee> coworkers;
    private Map<YearQuarter, Grade> quarterGrades;
}
このクラスは比較的複雑で、ネストされたオブジェクト、コレクション、およびマップがあります。
現在、デフォルトでは、コレクションの生成範囲は1〜100 *であるため、_Collection <Employee> _サイズはその間になります。
良いことは、*オブジェクトがキャッシュされて再利用される*ため、必ずしもすべてが一意ではないということです。 それでも、それほど多くは必要ないかもしれません。
コレクションの範囲を調整する方法についてはすぐに説明しますが、まず、遭遇する可能性のある別の問題を見てみましょう。
このドメインには、1年の4分の1を表す_YearQuarter_クラスがあります。
*開始日から3か月後を正確に指すように_endDate_を設定するためのロジックが少しあります*:
public class YearQuarter {

    private LocalDate startDate;
    private LocalDate endDate;

    public YearQuarter(LocalDate startDate) {
        this.startDate = startDate;
        autoAdjustEndDate();
    }

    private void autoAdjustEndDate() {
        endDate = startDate.plusMonths(3L);
    }
}
  • EasyRandomはリフレクションを使用してオブジェクトを構築します*。そのため、ライブラリを介してこのオブジェクトを生成すると、3か月の制約が単に保持されないため、おそらく役に立たないデータになります。 *。

    この問題に対処する方法を見てみましょう。

4.4. 世代構成

以下の構成では、* _ * EasyRandomParameters * ._を介して*カスタム構成を提供します
まず、目的の文字列の長さとコレクションのサイズを明示的に指定します。 次に、いくつかのフィールドを生成から除外します。たとえば、nullのみにする理由があるとしましょう。
ここでは、便利な_FieldPredicates_ユーティリティを使用して、除外述語を連鎖させました。
その後、別の便利な_TypePredicates_ユーティリティを使用して、_“ not.existing.pkg” _ Javaパッケージからすべてを除外します。
最後に、約束どおり、**カスタム** __ * YearQuarterRandomizerを適用することにより、_YearQuarter_クラスのstart_startDate_および_endDate_生成の問題に対処します:* __
@Test
void givenCustomConfiguration_thenGenerateSingleEmployee() {
    EasyRandomParameters parameters = new EasyRandomParameters();
    parameters.stringLengthRange(3, 3);
    parameters.collectionSizeRange(5, 5);
    parameters.excludeField(FieldPredicates.named("lastName").and(FieldPredicates.inClass(Employee.class)));
    parameters.excludeType(TypePredicates.inPackage("not.existing.pkg"));
    parameters.randomize(YearQuarter.class, new YearQuarterRandomizer());

    EasyRandom generator = new EasyRandom(parameters);
    Employee employee = generator.nextObject(Employee.class);

    assertEquals(3, employee.getFirstName().length());
    assertEquals(5, employee.getCoworkers().size());
    assertEquals(5, employee.getQuarterGrades().size());
    assertNotNull(employee.getDepartment());

    assertNull(employee.getLastName());

    for (YearQuarter key : employee.getQuarterGrades().keySet()) {
        assertEquals(key.getStartDate(), key.getEndDate().minusMonths(3L));
    }
}

5. 結論

モデル、DTO、またはエンティティオブジェクトを手動で設定するのは面倒で、コードの読み取りや重複が少なくなります。 EasyRandomは、時間を節約し、それを支援できる優れたツールです。
先ほど見たように、ライブラリは意味のある_String_オブジェクトを生成しませんが、フィールドのカスタムランダマイザーを作成して整理できるhttps://github.com/DiUS/java-faker[Java Faker]という別のツールがあります同じように。
また、ライブラリをより深く理解し、さらに多くのライブラリを構成できるかどうかを確認するには、https://github.com/j-easy/easy-random/wiki [Github Wiki page]をご覧ください。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/easy-random[GitHub]で見つけることができます。