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이 유용할 수 있는 다른 사용 사례도 많이 있습니다. 위키에서 전체 목록을 찾을 수 있습니다.
GitHub에서 풀 요청을 통해 프로젝트에 기여하실 수 있습니다. Easy Random은 유지 관리 모드에 있으므로 버그 수정에 대한 풀 요청만 고려됩니다.
버그를 발견했다고 생각하거나 질문이 있는 경우 문제 추적기를 사용하세요.
귀하의 기여에 감사드립니다!
MIT 라이센스. LICENSE.txt를 참조하세요.