Автор оригинала: Denis Szczukocki.
1. Обзор
В этом учебнике мы покажем, как создавать Java-объекты с помощью EasyRandom библиотека.
2. EasyRandom
В некоторых случаях нам нужен набор объектов модели, которые мы будем использовать для целей тестирования. Или мы хотели бы заполнить нашу тестовую базу данных некоторыми данными, которые мы собираемся использовать. Тогда, может быть, мы хотели бы иметь коллекции фиктивных DTOs отправить обратно к нашему клиенту.
Настройка одного, двух или нескольких таких объектов может быть легкой, если они не сложны. Тем не менее, может быть случай, когда мы должны сотни из них немедленно, не получая наши руки грязные с ручной установки.
Вот где EasyRandom шаги дюйма EasyRandom – это библиотека, которая проста в использовании, не требует практически ничего настройки и просто в обход типа класса, он собирается мгновенно целый объект графики для нас.
Посмотрим, как это просто.
3. Зависимость от Maven
Во-первых, давайте добавим легко случайных основных Maven зависимость к нашему пом.xml :
org.jeasy easy-random-core 4.0.0
4. Генерация объектов
Двумя наиболее важными классами в библиотеке являются:
- EasyRandom , который собирается генерировать объекты, и
- EasyRandomПараметеры что позволяет нам настроить процесс генерации и сделать его более предсказуемым.
4.1. Единый объект
Наш первый пример генерирует простой случайный Лицо объект, который не имеет вложенных объектов, никаких коллекций, Интегер , и два Струны .
Давайте создать один экземпляр нашего объекта с помощью nextObject (класс
@Test void givenDefaultConfiguration_thenGenerateSingleObject() { EasyRandom generator = new EasyRandom(); Person person = generator.nextObject(Person.class); assertNotNull(person.getAge()); assertNotNull(person.getFirstName()); assertNotNull(person.getLastName()); }
Вот как объект может выглядеть после генерации:
Person[firstName='eOMtThyhVNLWUZNRcBaQKxI', lastName='yedUsFwdkelQbxeTeQOvaScfqIOOmaa', age=-1188957731]
Как мы видим, генерируемые строки могут быть слишком длинными, а возраст отрицательным. Мы покажем, как это можно настроить в дальнейших разделах.
4.2. Коллекция объектов
Теперь, скажем, нам нужна коллекция Лицо Объектов. Другой метод, объекты (класс
Хорошо то, что он возвращает поток объектов, так что в конце концов, мы могли бы добавить промежуточные операции к нему или группы, как мы хотим.
Вот как мы могли бы генерировать пять экземпляров Лицо :
@Test void givenDefaultConfiguration_thenGenerateObjectsList() { EasyRandom generator = new EasyRandom(); Listpersons = generator.objects(Person.class, 5) .collect(Collectors.toList()); assertEquals(5, persons.size()); }
4.3. Поколение сложных объектов
Давайте посмотрим на наши Сотрудник класс:
public class Employee { private long id; private String firstName; private String lastName; private Department department; private Collectioncoworkers; private Map quarterGrades; }
Наш класс относительно сложен, у него есть вложенный объект, коллекция и карта.
Теперь по умолчанию, диапазон генерации коллекции составляет от 1 до 100 , так что наши Сбор
Хорошо, что объекты будут кэшированы и повторно использованы , так что не обязательно все они уникальны. Тем не менее, нам, возможно, не нужно так много.
Мы скоро рассмотрим, как настроить диапазон коллекции, но сначала, давайте посмотрим на другой вопрос, который мы могли бы запустить в.
В нашей области, у нас есть Год квартал класс, который составляет четверть года.
Там немного логики, чтобы настроить конецDate указать ровно на 3 месяца после даты начала :
public class YearQuarter { private LocalDate startDate; private LocalDate endDate; public YearQuarter(LocalDate startDate) { this.startDate = startDate; autoAdjustEndDate(); } private void autoAdjustEndDate() { endDate = startDate.plusMonths(3L); } }
Мы должны отметить, EasyRandom использует отражение для построения наших объектов , таким образом, генерация этого объекта через библиотеку приведет к данным, которые, скорее всего, не будет полезным для нас, как наше ограничение в 3 месяца просто не будет сохранена .
Давайте посмотрим, как мы могли бы решить эту проблему.
4.4. Конфигурация поколения
В приведенной ниже конфигурации мы поставляем наши пользовательская конфигурация через EasyRandomПараметеры .
Во-первых, мы прямо оформим желаемую длину строки и размер коллекций. Далее, мы исключаем некоторые поля из поколения в поколение, скажем, у нас была причина, чтобы иметь только nulls.
Здесь мы использовали удобный FieldPredicates утилита для цепочки предикатов исключения.
После этого мы исключаем все из “не.существующий.pkg” Java пакет, через другой удобный TypePredicates полезность.
И, наконец, как и было обещано, мы обращаемся к этой проблеме началоDate и конецDate поколение Год квартал класса, применяя наши пользовательские ГодквартерРандомайзер:
@Test void givenCustomConfiguration_thenGenerateSingleEmployee() { EasyRandomParameters parameters = new EasyRandomParameters(); parameters.stringLengthRange(3, 3); parameters.collectionSizeRange(5, 5); parameters.excludeField(FieldPredicates.named("lastName").and(FieldPredicates.inClass(Employee.class))); parameters.excludeType(TypePredicates.inPackage("not.existing.pkg")); parameters.randomize(YearQuarter.class, new YearQuarterRandomizer()); EasyRandom generator = new EasyRandom(parameters); Employee employee = generator.nextObject(Employee.class); assertEquals(3, employee.getFirstName().length()); assertEquals(5, employee.getCoworkers().size()); assertEquals(5, employee.getQuarterGrades().size()); assertNotNull(employee.getDepartment()); assertNull(employee.getLastName()); for (YearQuarter key : employee.getQuarterGrades().keySet()) { assertEquals(key.getStartDate(), key.getEndDate().minusMonths(3L)); } }
5. Заключение
Ручная настройка модели, DTO или объектов сущности может быть громоздким и приводить к менее читаемому коду и дублированию. EasyRandom является хорошим инструментом, который может сэкономить время и помочь с ним.
Как мы видели, библиотека не генерирует значимых Струнные объектов, но есть еще один инструмент, называемый Java Faker с помощью которых мы могли бы создать пользовательские рандомизаторы для полей, чтобы разобраться в этом, а также.
Кроме того, чтобы иметь более глубокое представление о библиотеке и посмотреть, насколько больше она может быть настроена, мы могли бы взглянуть на ее Страница Github Wiki .
Как обычно, код можно найти в течение GitHub .