🚀 Capítulo 12: Testes Unitários e Mockito
🎯 Objetivo da Aula
Ao final desta aula, você será capaz de escrever testes unitários utilizando o JUnit 5, simular dependências com o Mockito e compreender o fluxo de desenvolvimento guiado por testes (TDD).
🏢 O Cenário Prático (Seu Desafio)
Você é Lucius Fox, o engenheiro chefe das Indústrias Wayne. O seu desafio é garantir que os equipamentos do cinto de utilidades do Batman funcionem perfeitamente antes de ele ir para as ruas de Gotham. Para isso, você deve criar testes automatizados para validar o software dos dispositivos.
🧠 Fundamentos: A Teoria Traduzida
Testar software manualmente é lento e passível de falhas. Por isso, na engenharia de software moderna, usamos testes automatizados.
- Teste Unitário: Testa a menor parte do sistema (geralmente um único método) de forma isolada. (Ex: Testar se o lançador de ganchos trava na altura correta).
- JUnit 5: É a biblioteca padrão que usamos em Java para criar e rodar esses testes.
- Mockito: Serve para criar “objetos dublês” (mocks). Use quando o método que você quer testar depende de algo externo que você não quer ou não pode acessar agora (ex: O sinal de GPS do satélite da Liga da Justiça).
Ciclo do TDD (Red, Green, Refactor)
- Red: Escreva um teste que falha (pois o código ainda não existe).
- Green: Escreva o código mais simples para fazer o teste passar.
- Refactor: Melhore o código mantendo o teste passando.
📖 Exemplo Guiado
Vamos testar o sistema de cálculo de combustível do Batmóvel.
- Crie a classe
Batmovel.java(O código que queremos testar):
public class Batmovel {
public boolean calcularAutonomia(int combustivel, int distancia) {
// Cada litro rende 10km
return combustivel * 10 >= distancia;
}
}- Crie a classe de teste
BatmovelTest.java(Usando JUnit 5):
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class BatmovelTest {
@Test
public void deveTerAutonomiaSuficiente() {
Batmovel batmovel = new Batmovel();
// Se tenho 10 litros, devo conseguir andar 100km
boolean resultado = batmovel.calcularAutonomia(10, 100);
// Verifica se o resultado é verdadeiro
assertTrue(resultado, "O Batmóvel deveria ter autonomia!");
}
}🕹️ Como Executar os Testes no VS Code
- Abra o arquivo
BatmovelTest.java. - Você verá um pequeno link escrito Run Test (ou uma seta verde) logo acima da linha
@Test. - Clique em Run Test.
- O VS Code abrirá a aba “Test Results” e você deverá ver uma barra verde indicando que o teste passou!
Resultado Esperado:
| Teste | Entrada | Saída Esperada |
|---|---|---|
deveTerAutonomiaSuficiente | combustivel=10, distancia=100 | Sucesso (Barra Verde) |
🛠️ Prática Obrigatória 1
Crie uma classe chamada Dispositivo com o método boolean verificarIntegridade(int energia). O método retorna true se a energia for maior que 50. Crie uma classe de teste usando JUnit 5 para validar esse comportamento (crie um teste que espera true com energia 60 e outro que espera false com energia 40).
Resultado Esperado:
| Teste | Entrada | Saída Esperada |
|---|---|---|
deveSerIntegro | energia=60 | Sucesso (Barra Verde) |
naoDeveSerIntegro | energia=40 | Sucesso (Barra Verde) |
🛠️ Prática Obrigatória 2
Imagine que o sistema de rádio do Batman depende de um ServidorFrequencia externo. Como não temos o servidor real agora, use o Mockito para simular o comportamento dele.
Crie o teste onde o mock do servidor deve fingir que está ativo (retornar true para o método estaAtivo()).
Resultado Esperado:
| Teste | Comportamento Simulado | Saída Esperada |
|---|---|---|
deveFuncionarComServidorAtivo | estaAtivo() retorna true | Sucesso (Barra Verde) |
📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:
- Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
- Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
- Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
- Faça o Commit:
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
Finaliza atividades do Capítulo 12. - Clique no botão azul Commit to main (ou o nome da sua branch).
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
- Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
- ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
- Como entregar no Microsoft Teams:
- Copie o link do seu repositório no GitHub (ex:
https://github.com/seu-usuario/seu-repositorio). - Abra a tarefa correspondente no Microsoft Teams.
- Clique no botão Adicionar trabalho (ou Add work).
- Selecione a opção Link no menu lateral.
- Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex:
Meu Repositório) no campo “Texto a ser exibido”. - Clique em Anexar.
- MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!
- Copie o link do seu repositório no GitHub (ex:
💡 Checkpoint de Lógica
O que você acabou de fazer é garantir a qualidade do software. Em grandes empresas, nenhum código vai para produção sem passar por uma bateria de centenas de testes automatizados. É a sua rede de segurança contra bugs!
🔥 Desafio de Fixação (Opcional)
Aplique o TDD (escreva o teste primeiro!) para criar um método que valide se uma senha de acesso ao Batcomputador é forte (tem mais de 8 caracteres).
🔑 Gabarito de Código/Fórmulas
Prática 1:
// Classe
public class Dispositivo {
public boolean verificarIntegridade(int energia) {
return energia > 50;
}
}
// Teste
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class DispositivoTest {
@Test
public void deveSerIntegro() {
Dispositivo d = new Dispositivo();
assertTrue(d.verificarIntegridade(60));
}
@Test
public void naoDeveSerIntegro() {
Dispositivo d = new Dispositivo();
assertFalse(d.verificarIntegridade(40));
}
}Prática 2:
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class RadioTest {
@Test
public void deveFuncionarComServidorAtivo() {
// Criando o mock da interface ou classe
ServidorFrequencia mockServidor = mock(ServidorFrequencia.class);
// Configurando o comportamento simulado
when(mockServidor.estaAtivo()).thenReturn(true);
// Testando usando o mock
assertTrue(mockServidor.estaAtivo());
}
}Desafio:
// Teste Primeiro!
@Test
public void deveValidarSenhaForte() {
Validador v = new Validador();
assertTrue(v.isForte("batman123")); // Deve retornar true
}