Exercícios sobre JUnit e Mockito
Neste exercício você vai praticar a criação de testes unitários com JUnit e Mockito. O cenário é um sistema de logística que gerencia veículos e cargas. O exercício está dividido em duas partes: na primeira, você escreve testes usando apenas o JUnit; na segunda, você utiliza o Mockito para simular uma dependência externa.
Parte 1 — Testes com JUnit
Contexto
A classe Vehicle representa um veículo capaz de transportar cargas até um limite máximo de peso. A classe já está implementada e possui os seguintes membros:
| Membro | Descrição |
|---|---|
Vehicle(int weightLimit) | Construtor que define o limite máximo de peso do veículo. |
addWeight(Load load) | Adiciona uma carga ao veículo. |
checkWeightLimit() | Retorna true se o peso total das cargas estiver dentro do limite, false caso contrário. |
O que fazer
- Abra o projeto
logistics(veja como obter o código abaixo). - Crie uma classe de teste chamada
VehicleTest. - Implemente pelo menos três cenários de teste que cubram as situações descritas a seguir.
Cenários sugeridos
- Adicionar cargas — adicione uma ou mais cargas ao veículo e verifique se a lista de cargas contém a quantidade esperada.
- Peso dentro do limite — adicione cargas cujo peso total não exceda o limite e verifique se
checkWeightLimit()retornatrue. - Peso acima do limite — adicione cargas cujo peso total ultrapasse o limite e verifique se
checkWeightLimit()retornafalse. - Veículo vazio — sem adicionar nenhuma carga, verifique se
checkWeightLimit()retornatrue.
Dicas
- Dê nomes descritivos aos seus métodos de teste (por exemplo,
deveRetornarTrueQuandoPesoDentroDoLimite). - Execute os testes e, caso algum falhe, depure o código até que todos passem.
Código do projeto
Para obter o código inicial, clone o repositório e abra o projeto:
git clone -b dev https://github.com/rodrigoprestesmachado/vvs
code exemplos/logistics
Parte 2 — Testes com Mockito
Contexto
Imagine que o projeto evoluiu e a lógica de validação de peso foi extraída para um serviço externo chamado WeightService. Agora, a classe Vehicle depende desse serviço para verificar se o peso total é aceitável. Como não queremos depender da implementação real do serviço durante os testes, vamos usar o Mockito para simulá-lo.
A interface WeightService possui o seguinte método:
public interface WeightService {
/**
* Verifica se o total de peso está dentro do limite permitido.
*/
boolean isWeightAllowed(int totalWeight, int maxWeightLimit);
}
A classe Vehicle foi modificada para receber o serviço como dependência:
public class Vehicle {
private int maximumWeightLimit;
private List<Load> loads = new ArrayList<>();
private WeightService weightService;
public Vehicle(int weightLimit, WeightService weightService) {
this.maximumWeightLimit = weightLimit;
this.weightService = weightService;
}
public void addWeight(Load load) {
loads.add(load);
}
public boolean checkWeightLimit() {
int total = loads.stream().mapToInt(Load::getWeight).sum();
return weightService.isWeightAllowed(total, maximumWeightLimit);
}
public int getMaximumWeightLimit() {
return maximumWeightLimit;
}
public List<Load> getLoads() {
return loads;
}
}
O que fazer
Crie uma classe de teste que utilize @ExtendWith(MockitoExtension.class) e declare um mock de WeightService com @Mock. Implemente testes que cubram os três cenários abaixo:
Cenário 1 — ✅ Peso dentro do limite
- Configure o mock para que
isWeightAllowed(...)retornetrue. - Adicione cargas ao veículo e chame
checkWeightLimit(). - Verifique se o método retorna
true. - Use
verify(...)para confirmar que o mock foi chamado com os valores esperados.
Cenário 2 — ❌ Peso acima do limite
- Configure o mock para que
isWeightAllowed(...)retornefalse. - Adicione cargas ao veículo e chame
checkWeightLimit(). - Verifique se o método retorna
false.
Cenário 3 — ⚠️ Serviço lança exceção
- Configure o mock para que
isWeightAllowed(...)lance umaRuntimeExceptionusandowhen(...).thenThrow(...). - Verifique se a exceção é propagada corretamente ao chamar
checkWeightLimit(), utilizandoassertThrows.
Dicas para resolver o exercício com IA
Se estiver utilizando uma IA como apoio, experimente as seguintes abordagens:
- Peça explicações conceituais — por exemplo, “O que é um mock e por que ele é útil em testes unitários?”
- Solicite analogias — analogias ajudam a fixar conceitos abstratos.
- Peça exemplos simples — peça que o conceito seja aplicado em um problema diferente do exercício.
- Solicite exemplos de código comentados — para entender cada linha.
- Peça ajuda para depuração — cole o erro e pergunte o que ele significa.

CC BY 4.0 DEED