ณ วันที่ 15 พฤศจิกายน 2020 Easy Random อยู่ในโหมดบำรุงรักษา ซึ่งหมายความว่านับจากนี้เป็นต้นไปจะมีการแก้ไขเฉพาะข้อบกพร่องเท่านั้น (ยกเว้นการสนับสนุนบันทึกซึ่งจะเผยแพร่เมื่อ Java 16 ออกมา) เวอร์ชัน 5.0.x (บน Java 11) และเวอร์ชัน 4.3.x (บน Java 8) เป็นเวอร์ชันเดียวที่ได้รับการสนับสนุนในตอนนี้ โปรดพิจารณาอัปเกรดเป็นเวอร์ชันใดเวอร์ชันหนึ่งเหล่านี้โดยเร็วที่สุด
Easy Random เป็นไลบรารีที่สร้างอ็อบเจ็กต์ Java แบบสุ่ม คุณสามารถคิดว่ามันเป็น ObjectMother สำหรับ JVM สมมติว่าคุณมีคลาส 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()
จะทำอย่างไรถ้าคุณต้องการสร้าง Random String
? หรือพูดอินสแตนซ์สุ่มของวัตถุโดเมนของคุณ? Easy Random จัดเตรียม EasyRandom
API ที่ขยาย java.util.Random
ด้วยเมธอดที่เรียกว่า nextObject(Class type)
วิธีการนี้สามารถสร้างอินสแตนซ์แบบสุ่มของ 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
ที่กำหนดเป็นนิพจน์แลมบ์ดา)age
ประเภท Integer
ในคลาส Person
เมธอดสแตติก named
, ofType
และ inClass
ถูกกำหนดไว้ใน 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 มีประโยชน์ คุณสามารถค้นหารายการที่ไม่ครบถ้วนสมบูรณ์ได้ในวิกิ
คุณสามารถมีส่วนร่วมในโครงการด้วยคำขอดึงบน GitHub โปรดทราบว่า Easy Random อยู่ในโหมดบำรุงรักษา ซึ่งหมายความว่าจะพิจารณาเฉพาะคำขอดึงข้อมูลสำหรับการแก้ไขข้อบกพร่องเท่านั้น
หากคุณเชื่อว่าคุณพบจุดบกพร่องหรือมีคำถามใดๆ โปรดใช้เครื่องมือติดตามปัญหา
ขอขอบคุณทุกท่านสำหรับการมีส่วนร่วมของคุณ!
ใบอนุญาตเอ็มไอที ดู LICENSE.txt