Guia rápido do EasyRandom em Java

Guia rápido do EasyRandom em Java

1. Visão geral

Neste tutorial, mostraremos como gerar objetos Java com a bibliotecaEasyRandom.

2. EasyRandom

Em alguns casos, precisamos de um conjunto de objetos de modelo que usaremos para fins de teste. Ou, gostaríamos de preencher nosso banco de dados de teste com alguns dados que vamos usar. Então, talvez quiséssemos ter coleções de DTOs fictícios para enviar de volta ao nosso cliente.

Configurar um, dois ou alguns desses objetos pode ser fácil se eles não forem complexos. No entanto, pode haver um caso em que precisaríamos de centenas deles imediatamente, sem sujar as mãos com a configuração manual.

É aqui que entraEasyRandom. EasyRandom é umlibrary that’s easy to use, requires little to nothing set up and just bypassing the class type, it’s gonna instantiate whole object graphs for us.

Vamos ver como é fácil.

3. Dependência do Maven

Primeiro, vamos adicionarthe easy-random-core Maven dependency ao nossopom.xml:


    org.jeasy
    easy-random-core
    4.0.0

4. Geração de Objetos

As duas classes mais importantes da biblioteca são:

  • EasyRandom que vai gerar os objetos, e

  • EasyRandomParameters que nos permite configurar o processo de geração e torná-lo mais previsível.

4.1. Objeto único

Nosso primeiro exemplo gera um objetoPerson aleatório simples que não possui objetos aninhados, nenhuma coleção, apenas umIntegere doisStrings.

Vamosgenerate one instance of our object using nextObject(Class<T> t):

@Test
void givenDefaultConfiguration_thenGenerateSingleObject() {
    EasyRandom generator = new EasyRandom();
    Person person = generator.nextObject(Person.class);

    assertNotNull(person.getAge());
    assertNotNull(person.getFirstName());
    assertNotNull(person.getLastName());
}

É assim que o objeto pode cuidar da geração:

Person[firstName='eOMtThyhVNLWUZNRcBaQKxI', lastName='yedUsFwdkelQbxeTeQOvaScfqIOOmaa', age=-1188957731]

Como podemos ver, as strings geradas podem ser um pouco longas demais, e a idade é negativa. Mostraremos como isso pode ser ajustado em outras seções.

4.2. Uma coleção de objetos

Agora, digamos que precisamos de uma coleção de objetosPerson. Outro método,objects(Class<T> t, int size), nos permitirá fazer isso.

Uma coisa boa é que ele retorna fluxo de objetos, então, eventualmente,we could add intermediate operations para ele ou agrupa como quisermos.

Veja como poderíamosgenerate five instances of Person:

@Test
void givenDefaultConfiguration_thenGenerateObjectsList() {
    EasyRandom generator = new EasyRandom();
    List persons = generator.objects(Person.class, 5)
        .collect(Collectors.toList());

    assertEquals(5, persons.size());
}

4.3. Geração de objetos complexos

Vamos dar uma olhada em nossa classeEmployee:

public class Employee {
    private long id;
    private String firstName;
    private String lastName;
    private Department department;
    private Collection coworkers;
    private Map quarterGrades;
}

Nossa classe é relativamente complexa, possui um objeto aninhado, uma coleção e um mapa.

Agora, por padrão,the collection generation range is from 1 to 100, então nosso tamanhoCollection<Employee> resultaria no meio.

Uma coisa boa é que osobjects are going to be cached and re-used, portanto, nem todos são necessariamente únicos. Ainda assim, talvez não precisemos de tantos.

Em breve, veremos como ajustar o alcance da coleção, mas, primeiro, vamos ver outro problema que podemos encontrar.

Em nosso domínio, temos uma classeYearQuarter que representa um quarto de ano.

Há um pouco de lógica emset up the endDate to point exactly to 3 months after the start date:

public class YearQuarter {

    private LocalDate startDate;
    private LocalDate endDate;

    public YearQuarter(LocalDate startDate) {
        this.startDate = startDate;
        autoAdjustEndDate();
    }

    private void autoAdjustEndDate() {
        endDate = startDate.plusMonths(3L);
    }
}

Devemos observar,EasyRandom uses reflection to construct our objects, então gerar este objeto através da biblioteca resultará em dados que, provavelmente,won’t be useful for us as our constraint of 3 months simply won’t be preserved.

Vejamos como podemos resolver esse problema.

4.4. Configuração de Geração

Na configuração abaixo, fornecemos nossocustom configuration via*EasyRandomParameters*.

Primeiro, declaramos explicitamente o tamanho da string e o tamanho das coleções desejados. Em seguida, excluímos alguns dos campos da geração, digamos que temos um motivo para ter apenas nulos.

Aqui, usamos o útil utilitárioFieldPredicates para encadear os predicados de exclusão.

Depois disso, excluímos tudo do pacote Java“not.existing.pkg”, por meio de outro utilitário útilTypePredicates.

E finalmente, como prometido,we address the issue with startDate and endDate generation of YearQuarter class by applying our custom YearQuarterRandomizer:

@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. Conclusão

A configuração manual de um modelo, DTO ou objetos de entidade pode ser complicada e resultar em código e duplicação menos legíveis. EasyRandom é uma boa ferramenta que pode economizar tempo e ajudar com isso.

Como vimos, a biblioteca não gera objetosString significativos, mas há outra ferramenta chamadaJava Faker com a qual poderíamos criar randomizadores personalizados para os campos para classificá-los também.

Além disso, para ter uma visão mais aprofundada da biblioteca e ver o quanto mais ela pode ser configurada, podemos dar uma olhada em seuGithub Wiki page.

Como de costume, o código pode ser encontrado emGitHub.