2020 年 11 月 15 日の時点で、Easy Random はメンテナンス モードになっています。これは、今後はバグ修正のみが対処されることを意味します (Java 16 のリリース時にリリースされるレコードのサポートを除く)。現時点でサポートされているバージョンは、バージョン 5.0.x (Java 11 ベース) とバージョン 4.3.x (Java 8 ベース) のみです。できるだけ早くこれらのバージョンのいずれかにアップグレードすることを検討してください。
Easy Random は、ランダムな Java オブジェクトを生成するライブラリです。これは、JVM の ObjectMother と考えることができます。クラスPerson
があり、そのランダムなインスタンスを生成したいとします。次のようにします。
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
EasyRandom#nextObject
メソッドは、任意のタイプのランダムなインスタンスを生成できます。
java.util.Random
API は、ランダム データを生成する 7 つのメソッド、 nextInt()
、 nextLong()
nextDouble()
、 nextFloat()
、 nextBytes()
、 nextBoolean()
およびnextGaussian()
を提供します。ランダムなString
を生成する必要がある場合はどうすればよいでしょうか?それとも、ドメイン オブジェクトのランダムなインスタンスと言えますか? Easy Random はnextObject(Class type)
というメソッドでjava.util.Random
を拡張するEasyRandom
API を提供します。このメソッドは、任意の Java Bean のランダムなインスタンスを生成できます。
EasyRandomParameters
クラスは、 EasyRandom
インスタンスを構成するための主要なエントリ ポイントです。すべてのパラメータを設定して、ランダム データの生成方法を制御できます。
EasyRandomParameters parameters = new EasyRandomParameters ()
. seed ( 123L )
. objectPoolSize ( 100 )
. randomizationDepth ( 3 )
. charset ( forName ( "UTF-8" ))
. timeRange ( nine , five )
. dateRange ( today , tomorrow )
. stringLengthRange ( 5 , 50 )
. collectionSizeRange ( 1 , 10 )
. scanClasspathForConcreteTypes ( true )
. overrideDefaultInitialization ( false )
. ignoreRandomizationErrors ( true );
EasyRandom easyRandom = new EasyRandom ( parameters );
これらのパラメータの詳細については、構成パラメータのセクションを参照してください。
ほとんどの場合、デフォルトのオプションで十分であり、 EasyRandom
のデフォルトのコンストラクターを使用できます。
Easy Random を使用すると、 org.jeasy.random.api.Randomizer
インターフェイスを通じてランダム データを生成する方法を制御でき、 java.util.function.Predicate
を使用してオブジェクト グラフから一部のフィールドを簡単に除外できます。
EasyRandomParameters parameters = new EasyRandomParameters ()
. randomize ( String . class , () -> "foo" )
. excludeField ( named ( "age" ). and ( ofType ( Integer . class )). and ( inClass ( Person . class )));
EasyRandom easyRandom = new EasyRandom ( parameters );
Person person = easyRandom . nextObject ( Person . class );
前の例では、Easy Random は次のことを行います。
String
型のすべてのフィールドをfoo
に設定します (ラムダ式として定義されたRandomizer
を使用)Person
のInteger
型のage
という名前のフィールドを除外します。 、 ofType
およびinClass
named
静的メソッドは、除外するフィールドを正確に定義するために組み合わせて使用できる共通の述語を提供するorg.jeasy.random.FieldPredicates
で定義されています。 TypePredicates
と呼ばれる同様のクラスを使用して、オブジェクト グラフから除外する型を定義できます。もちろん、独自のjava.util.function.Predicate
これらの事前定義された述語と組み合わせて使用することもできます。
ドメイン モデルに多くの関連クラスが含まれていない限り、Java オブジェクトにランダム データを設定することは、一見すると簡単に見えます。前の例では、 Person
タイプが次のように定義されていると仮定します。
Easy Random を使用しない場合は、次のコードを記述してPerson
クラスのインスタンスを作成することになります。
Street street = new Street ( 12 , ( byte ) 1 , "Oxford street" );
Address address = new Address ( street , "123456" , "London" , "United Kingdom" );
Person person = new Person ( "Foo" , "Bar" , "[email protected]" , Gender . MALE , address );
また、これらのクラスがパラメーターを備えたコンストラクターを提供しない場合 (変更できないレガシー型の可能性があります)、次のように記述します。
Street street = new Street ();
street . setNumber ( 12 );
street . setType (( byte ) 1 );
street . setName ( "Oxford street" );
Address address = new Address ();
address . setStreet ( street );
address . setZipCode ( "123456" );
address . setCity ( "London" );
address . setCountry ( "United Kingdom" );
Person person = new Person ();
person . setFirstName ( "Foo" );
person . setLastName ( "Bar" );
person . setEmail ( "[email protected]" );
person . setGender ( Gender . MALE );
person . setAddress ( address );
Easy Randomでは、ランダムなPerson
オブジェクトの生成はnew EasyRandom().nextObject(Person.class)
で行われます。ライブラリはすべてのオブジェクト グラフに再帰的にデータを取り込みます。それは大きな違いです!
場合によっては、テスト フィクスチャがテスト ロジックにとって実際には重要ではないことがあります。たとえば、新しい並べ替えアルゴリズムの結果をテストしたい場合は、データ自体に関係なく、ランダムな入力データを生成し、出力が並べ替えられていることをアサートできます。
@ org . junit . Test
public void testSortAlgorithm () {
// Given
int [] ints = easyRandom . nextObject ( int []. class );
// When
int [] sortedInts = myAwesomeSortAlgo . sort ( ints );
// Then
assertThat ( sortedInts ). isSorted (); // fake assertion
}
別の例は、ドメイン オブジェクトの永続性をテストすることです。ランダムなドメイン オブジェクトを生成し、それを永続化し、データベースに同じ値が含まれていることをアサートできます。
@ org . junit . Test
public void testPersistPerson () throws Exception {
// Given
Person person = easyRandom . nextObject ( Person . class );
// When
personDao . persist ( person );
// Then
assertThat ( "person_table" ). column ( "name" ). value (). isEqualTo ( person . getName ()); // assretj db
}
Easy Random が役立つ使用例は他にもたくさんあります。すべてを網羅していないリストは wiki で見つけることができます。
GitHub のプル リクエストでプロジェクトに貢献していただければ幸いです。 Easy Random はメンテナンス モードであることに注意してください。つまり、バグ修正のプル リクエストのみが考慮されます。
バグを見つけたと思われる場合、または質問がある場合は、問題トラッカーを使用してください。
ご協力いただきありがとうございました!
MITライセンス。 LICENSE.txtを参照してください。