Uma biblioteca Java para automatizar a configuração de dados em testes de unidade.
Neste post, vou apresentar a biblioteca instancio (www.instancio.org), uma ferramenta poderosa para facilitar a criação de testes unitários em Java. A biblioteca instancio permite instanciar objetos complexos com apenas uma linha de código, evitando a necessidade de escrever construtores, setters ou builders. Além disso, a biblioteca instancio é compatível com o Junit, o framework mais popular para testes unitários em Java.
Para ilustrar o uso da biblioteca instancio, vou usar um exemplo de um sistema de escola que oferece cursos aos alunos. O sistema possui as classes Curso, Aluno, Plrofessor e Matricula, que representam os conceitos do domínio. Cada classe possui vários atributos e métodos, que não serão detalhados aqui por questão de simplicidade. O objetivo é testar o método matricularAluno da classe Curso, que recebe um objeto Aluno e cria uma nova Matricula associada ao curso e ao aluno.
Sem a biblioteca instancio, para criar um objeto Curso e um objeto Aluno para o teste, seria necessário escrever algo como:
Com a biblioteca instancio, basta escrever:
Casos de teste
Configurando o projeto
Para usar a biblioteca instancio, você só precisa adicionar a dependência no seu projeto. Neste caso, estou utilizando maven:
A biblioteca instancio também suporta tipos genéricos, classes record e sealed, arrays e streams. Você pode criar coleções de objetos usando o método `ofList`:
Como personalizar os valores gerados
Esse código cria um objeto `Pessoa` com o campo `dataNascimento` gerado usando o gerador `gen.temporal().localDate().past()`, que retorna uma data passada aleatória.
Você também pode usar o método `set` para definir um valor fixo para um campo:
Esse código cria um objeto `Person` com o campo `firstName` definido como "João".
Outro método útil é o `supply`, que permite fornecer um valor dinâmico para um campo usando um `Supplier`:
Esse código cria um objeto `Pessoa` com todos os campos do tipo `LocalDate` definidos como o momento atual.
Além disso, você pode usar o método `onComplete` para executar uma ação após a criação do objeto:
Esse código cria um objeto `Pessoa` e depois define o campo `nome` de acordo com o campo `genero`.
Como criar modelos reutilizáveis de objetos
Se você precisar criar vários objetos com características semelhantes, você pode usar o conceito de modelos (Models) da biblioteca instancio. Um modelo é uma forma de definir um template de objeto que pode ser reutilizado em diferentes testes.
Por exemplo, se você quiser criar objetos da classe `Pessoa` que representam membros da família Simpson, você pode criar um modelo assim:
Esse modelo define que todos os objetos `Aluno` criados a partir dele terão o sobrenome "Simpson", a cidade "Springfield" e uma idade entre 40 e 50 anos.
Depois, você pode criar objetos específicos usando esse modelo:
Esses códigos criam objetos `Aluno` que representam o Homer e a Marge, usando os valores definidos no modelo e sobrescrevendo os valores específicos de cada um.
Principais recursos da biblioteca instancio
A biblioteca instancio possui vários recursos interessantes que facilitam a geração de dados de teste. Alguns deles são:
- Dados totalmente reproduzíveis em caso de falha nos testes. A biblioteca instancio usa uma semente (seed) para gerar os dados aleatórios, que pode ser especificada ou obtida pelo usuário. Assim, é possível reproduzir os mesmos dados que causaram a falha e corrigir o problema.
- Suporte para anotações de validação de beans. A biblioteca instancio pode gerar dados que respeitam as anotações de validação de beans, como `@NotNull`, `@Size`, `@Email`, etc. Isso evita que os testes falhem por causa de dados inválidos.
- Opções flexíveis de configuração. A biblioteca instancio permite configurar vários aspectos do comportamento da geração de dados, como o modo estrito ou leniente, a profundidade máxima, o mapeamento de subtipos, etc. Essas configurações podem ser feitas programaticamente ou usando um arquivo de propriedades.
- Integração com JUnit Jupiter. A biblioteca instancio oferece uma extensão para JUnit Jupiter que facilita a reprodução de testes falhos, a injeção de configurações e a geração de argumentos para testes parametrizados.
- Interface de provedor de serviço (SPI). A biblioteca instancio permite que o usuário crie e registre suas próprias implementações de interfaces como `GeneratorProvider`, `TypeResolver` e `TypeInstantiator`, para customizar ainda mais a geração de dados.
Conclusão
Neste post, apresentei a biblioteca instancio, uma ferramenta poderosa para gerar dados de teste em Java. Mostrei como usar sua API simples e flexível para criar objetos totalmente populados com dados aleatórios, personalizar os valores gerados e criar modelos reutilizáveis de objetos. Eu também listei alguns dos principais recursos da biblioteca, que tornam a geração de dados mais fácil e confiável.
Se você se interessou pela biblioteca instancio, você pode acessar o site https://www.instancio.org/user-guide para ver mais detalhes sobre sua documentação, exemplos e artigos. Você também pode contribuir com o projeto no GitHub: https://github.com/instancio/instancio.
E como sempre, um exemplo de utilização no meu GitHub: https://github.com/sandrogiacom/school-test
Espero que você tenha gostado deste post e que a biblioteca instancio possa te ajudar a escrever testes melhores e mais concisos em Java. Até a próxima!
Referências:
Comentários
Postar um comentário