Mulai tanggal 15 November 2020, Easy Random sedang dalam mode pemeliharaan. Ini berarti hanya perbaikan bug yang akan diatasi mulai sekarang (kecuali untuk dukungan catatan yang akan dirilis ketika Java 16 keluar). Versi 5.0.x (berdasarkan Java 11) dan versi 4.3.x (berdasarkan Java 8) adalah satu-satunya versi yang didukung untuk saat ini. Harap pertimbangkan untuk meningkatkan ke salah satu versi ini sesegera mungkin.
Easy Random adalah perpustakaan yang menghasilkan objek Java secara acak. Anda dapat menganggapnya sebagai ObjectMother untuk JVM. Katakanlah Anda memiliki kelas Person
dan Anda ingin membuat instance acaknya, ini dia:
EasyRandom easyRandom = new EasyRandom ();
Person person = easyRandom . nextObject ( Person . class );
Metode EasyRandom#nextObject
mampu menghasilkan instance acak dari tipe apa pun.
java.util.Random
API menyediakan 7 metode untuk menghasilkan data acak: nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
dan nextGaussian()
. Bagaimana jika Anda perlu membuat String
acak? Atau katakan contoh acak dari objek domain Anda? Easy Random menyediakan API EasyRandom
yang memperluas java.util.Random
dengan metode yang disebut nextObject(Class type)
. Metode ini mampu menghasilkan contoh acak dari kacang Java apa pun.
Kelas EasyRandomParameters
adalah titik masuk utama untuk mengonfigurasi instans EasyRandom
. Ini memungkinkan Anda mengatur semua parameter untuk mengontrol bagaimana data acak dihasilkan:
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 );
Untuk detail lebih lanjut tentang parameter ini, silakan merujuk ke bagian parameter konfigurasi.
Dalam kebanyakan kasus, opsi default sudah cukup dan Anda dapat menggunakan konstruktor default EasyRandom
.
Easy Random memungkinkan Anda mengontrol cara menghasilkan data acak melalui antarmuka org.jeasy.random.api.Randomizer
dan memudahkan untuk mengecualikan beberapa bidang dari grafik objek menggunakan 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 );
Pada contoh sebelumnya, Easy Random akan:
String
ke foo
(menggunakan Randomizer
yang didefinisikan sebagai ekspresi lambda)age
bertipe Integer
di kelas Person
. Metode statis named
, ofType
dan inClass
didefinisikan dalam org.jeasy.random.FieldPredicates
yang menyediakan predikat umum yang dapat Anda gunakan dalam kombinasi untuk menentukan dengan tepat bidang mana yang akan dikecualikan. Kelas serupa yang disebut TypePredicates
dapat digunakan untuk menentukan tipe mana yang akan dikecualikan dari grafik objek. Anda tentu saja dapat menggunakan java.util.function.Predicate
Anda sendiri yang dikombinasikan dengan predikat yang telah ditentukan sebelumnya.
Mengisi objek Java dengan data acak sekilas terlihat mudah, kecuali model domain Anda melibatkan banyak kelas terkait. Pada contoh sebelumnya, misalkan tipe Person
didefinisikan sebagai berikut:
Tanpa Easy Random, Anda akan menulis kode berikut untuk membuat instance kelas 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 );
Dan jika kelas-kelas ini tidak menyediakan parameter konstruktor (mungkin ada beberapa tipe lama yang tidak dapat Anda ubah), Anda akan menulis:
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 );
Dengan Easy Random, pembuatan objek Person
acak dilakukan dengan new EasyRandom().nextObject(Person.class)
. Perpustakaan akan mengisi semua grafik objek secara rekursif . Itu perbedaan yang besar!
Terkadang, perlengkapan pengujian tidak terlalu penting bagi logika pengujian. Misalnya, jika kita ingin menguji hasil algoritma pengurutan baru, kita dapat menghasilkan data masukan acak dan menegaskan bahwa keluarannya sudah diurutkan, apa pun datanya:
@ 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
}
Contoh lainnya adalah menguji persistensi objek domain, kita dapat membuat objek domain acak, menyimpannya, dan menyatakan bahwa database berisi nilai yang sama:
@ 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
}
Ada banyak kasus penggunaan lain di mana Easy Random dapat berguna, Anda dapat menemukan daftar yang tidak lengkap di wiki.
Anda dipersilakan untuk berkontribusi pada proyek dengan permintaan tarik di GitHub. Harap dicatat bahwa Easy Random sedang dalam mode pemeliharaan, yang berarti hanya permintaan penarikan untuk perbaikan bug yang akan dipertimbangkan.
Jika Anda yakin telah menemukan bug atau memiliki pertanyaan, silakan gunakan pelacak masalah.
Terima kasih atas kontribusi Anda!
Lisensi MIT. Lihat LISENSI.txt.