Java- Teste unitários com Junit 5 ☕ ✔️ - Repositório criado para documentar o processo de aprendizagem da ferramenta JUnt 5
Na aula 1 foi demonstrado como adicionar o junit como dependência maven e como efetuar o primeiro.
Dependência adicionada ao pom.xml:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>s
<version>5.9.1</version>
</dependency>
Na aula 2 foi demonstrado como codificar um método da forma mais simples possível assim como a estrutura básica de uma classe de teste (cenário,execução e verificação).
Deixarei aqui um exemplo de teste automátizado e o link para a classe que implementa outros casos de teste.
@Test
void testaMetodoEstaVivoQuandoAutorTemDataDeFalecimentoNulaDeveRetornarTrue(){
//cenário
var autor = new Autor();
//execução
var estaVivo = autor.estaVivo();
//verificação
Assertions.assertEquals(true, estaVivo);
}
- Clique aqui para verificar as implementações.
Na aula 3 o professor explorou os diversos métodos estáticos da classe Assertions. Desta forma,modifiquei os métodos para utilizar os métodos Assertions.assertTrue() e Assertions.assertFalse();
@Test
void testaMetodoEstaVivoQuandoAutorTemDataDeFalecimentoNulaDeveRetornarTrue(){
//cenário
var autor = new Autor();
//execução
var estaVivo = autor.estaVivo();
//verificação
Assertions.assertTrue(estaVivo);;
}
Clique aqui para verificar as implementações.
Na aula 4 foi demonstrado a famosa técnica do TDD (Test Driven Development) que seria o desenvolvimento orientado a testes. O TDD é pautado em três etapas:
- Escrevemos um Teste que inicialmente não passa (Red);
- Adicionamos uma nova funcionalidade do sistema;
- Fazemos o Teste passar (Green);
- Refatoramos o código da nova funcionalidade (Refactoring).
No nosso caso implementamos a funcionalidade de empréstimo na camada serviço da biblioteca e escrevemos o teste (antes) para a funcionalidade.
Clique aqui para verificar a implementação do teste e aqui para analisar a funcionalidade desenvolvida.
Na aula 5 o professor sugeriu que refatorassemos o código da funcionalidade para que, dessa forma, garantir aumento na legibilidade e qualidade do código. Caso deseje verificar a minha refatoração que consistiu em retirar um magic number e outros code smell basta clicar aqui;
Na aula 6 o professor sugeriu mais um exercicio do TDD. Desta forma implementei um método que modifica o prazo para devolução de acordo com a reputação do autor. A implementação está disponível aqui e os testes estão disponiveis aqui.
Na aula 7 o professor sugeriu que fizessemos uma refatorção do código para finalizar as etapas do TDD. Diante dessa tarefa, melhorei a qualidade do código retirando os if,else if e else alinhados e adicionando um método abstrado para o enum. Esse tipo de pattern é conhecido com strategy pattern Clique aqui para conferir a implementação dos métodos abstratos e aqui para olhar a implementação do método após a refatoração.
Na aula 8 o professor ensinou como testar se um metodo está disparando ou não uma exception. Confira aqui a implementação do método que lance uma exeception e aqui um teste que seja capaz de testar isso.
Na aula 9 o professor demonstrou as anotations
@BeforeAll
@BeforeEach
@AfterAll
@AfterEach
Dessa forma, declarei o objeto EmprestimosService como atributo da classe e o instanciei em um metodo setup() com a anotation @BeforeAll. Caso queira verificar a implementação deste método clique aqui.
Na aula 10 o professor explicou a importancia de fazer uma camada de builder para objetos de testes para evitar repetição de código. O mais interessante é que esse pattern é utilizado por algumas classes bem conhecidas no java como o StringBuilder e pode ser aplicado em vários contextos. Para visualizar a implementação dos builders clique aqui e para acompanhar a implementação de testes com a devida refatoração clique aqui
Na aula 11 o professor implementou uma interface de DAO para o emprestimoService e criou um método que notifica emprestimos atrasados.
- Clique aqui para visualizar a implementação da interface;
- Clique aqui para visualizar a implementação de DAO do emprestimo Service.
Na aula 12 o professor explicou como adicionar o mockito como dependencia do projeto.
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.11.2</version>
</dependency>
O professor ensinou a notação ExtendWith(MockitoExtension.class), @Mock e @InjectMocks. A maneira correta de fazer testes com mock tambem foi demonstrada.
- Clique aqui para visualizar a implementação dos testes com o mockito.