Projeto simples desenvolvido em Java para simular o funcionamento de um caixa eletrônico, retornando a menor quantidade possível de notas para um determinado valor de saque.
Implementar um sistema que:
- Receba um valor de saque
- Retorne a menor quantidade de notas possíveis
- Valide valores inválidos
- Utilize testes unitários com JUnit e Mockito
O sistema utiliza um algoritmo guloso (Greedy):
Sempre utiliza a maior nota disponível antes de passar para as menores.
Notas disponíveis:
- R$100
- R$50
- R$20
- R$10
| Entrada | Saída |
|---|---|
| 380 | 3x100 1x50 1x20 1x10 |
| 30 | 1x20 1x10 |
| 35 | Erro (valor inválido) |
- Java
- JUnit 5
- Mockito
Foram implementados testes para validar:
- ✔ Saque com valor válido
- ✔ Saque com valor inválido
- ✔ Comportamento do sistema com uso de mock (Mockito)
/src
├── CaixaEletronico.java
├── Logger.java
├── CaixaEletronicoTest.java
├── mockito-extensions/
│ └── org.mockito.plugins.MockMaker
/lib
├── junit-platform-console-standalone.jar
├── mockito-core.jar
├── byte-buddy.jar
├── objenesis.jar
javac -cp "lib/*" src/*.javajava -cp "lib/*;src" org.junit.platform.console.ConsoleLauncher --scan-class-path- O projeto foi configurado sem uso de Maven ou Gradle
- Mockito foi ajustado para funcionar com versões recentes do Java utilizando:
mock-maker-subclass
- Isso evita problemas com o mecanismo de agentes do Java
O projeto foi desenvolvido seguindo boas práticas de testes unitários:
Foi adotado o ciclo Test Driven Development (TDD):
- Escrita inicial de testes (falhando - RED)
- Implementação mínima para passar (GREEN)
- Refatoração do código (REFACTOR)
Todos os testes seguem o padrão:
- Arrange → preparação dos dados e mocks
- Act → execução da ação testada
- Assert → verificação dos resultados
- Cada teste é independente
- Não há compartilhamento de estado entre testes
- Uso de Mockito para simular dependências externas
Os testes seguem o padrão descritivo:
deve + comportamento + condição
Exemplo: deveRetornarNotasCorretasQuandoValorFor380
Os testes cobrem:
- ✔ Happy Path → valores válidos (ex: 380, 30)
- ✔ Edge Cases → valores mínimos (ex: 10)
- ✔ Exceções → valores inválidos (ex: 35)
Este projeto demonstra:
- Uso de lógica de programação (algoritmo guloso)
- Boas práticas com testes unitários
- Uso de bibliotecas externas (Mockito)
- Organização básica de projeto Java
Desenvolvido para fins acadêmicos.