По состоянию на 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
способен генерировать случайные экземпляры любого заданного типа.
API java.util.Random
предоставляет 7 методов для генерации случайных данных: nextInt()
, nextLong()
, nextDouble()
, nextFloat()
, nextBytes()
, nextBoolean()
и nextGaussian()
. Что делать, если вам нужно сгенерировать случайную String
? Или, скажем, случайный экземпляр вашего объекта домена? Easy Random предоставляет API EasyRandom
, который расширяет java.util.Random
методом nextObject(Class type)
. Этот метод способен генерировать случайный экземпляр любого произвольного Java-бина.
Класс 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 находится в режиме обслуживания, что означает, что будут рассматриваться только запросы на исправление ошибок.
Если вы считаете, что нашли ошибку или у вас есть вопросы, воспользуйтесь системой отслеживания проблем.
Спасибо всем за ваш вклад!
Лицензия MIT. См. ЛИЦЕНЗИЯ.txt.