1. 概要

このチュートリアルでは、EasyRandomライブラリを使用してJavaオブジェクトを生成する方法を示します。

2. EasyRandom

場合によっては、テスト目的で使用する一連のモデルオブジェクトが必要になります。 または、使用するデータをテストデータベースに入力します。 次に、ダミーのDTOのコレクションをクライアントに送り返す必要があるかもしれません。

複雑でなければ、そのようなオブジェクトを1つ、2つ、またはいくつか設定するのは簡単かもしれません。 それでも、手動セットアップで手を汚さずに、すぐに数百個必要になる場合があります。

ここでEasyRandomがステップインします。 EasyRandomは使いやすいライブラリであり、セットアップはほとんど必要なく、クラスタイプをバイパスするだけで、オブジェクトグラフ全体をインスタンス化できます。

それがいかに簡単か見てみましょう。

3. Mavenの依存関係

まず、easy-random-coreMaven依存関係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を使用してオブジェクトの1つのインスタンスを生成します t)

@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オブジェクトのコレクションが必要だとします。 別の方法、 オブジェクト(クラス t、intサイズ) そうすることができます。

良い点は、オブジェクトのストリームを返すため、最終的に中間操作を追加したり、必要に応じてグループ化したりできることです。

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です。 、だから私たちのコレクションサイズは間になります。

良いことは、オブジェクトがキャッシュされて再利用されるので、必ずしもすべてが一意であるとは限りません。 それでも、それほど多くは必要ないかもしれません。

コレクションの範囲を調整する方法についてはすぐに見ていきますが、最初に、発生する可能性のある別の問題を見てみましょう。

私たちのドメインには、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クラスの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 オブジェクトを生成しませんが、 Java Faker と呼ばれる別のツールがあり、フィールドのカスタムランダマイザーを作成して次のように分類できます。良い。

また、ライブラリの詳細を確認し、ライブラリをさらに構成できるかどうかを確認するには、GithubWikiページを参照してください。

いつものように、コードはGitHubにあります。