- Java 25
- Spring Boot 4.0.3
- Spring Web, Spring Data JPA, Validation
- H2
- JUnit 6.0.3 + Mockito + AssertJ
br/com/teste/backend/BackendApplication.java- Classe principal da aplicacao Spring Boot.
br/com/teste/backend/core/PersistenceConfig.java- Configuracao de persistencia/JPA.
br/com/teste/backend/models/Produto.java- Entidade JPA que representa a tabela
produtos. - Contem validacoes de dominio (nome obrigatorio, preco e estoque nao negativos).
- Entidade JPA que representa a tabela
br/com/teste/backend/repositories/ProdutoRepository.java- Interface de acesso a dados (
JpaRepository). - Inclui
existsByNomepara validacao de duplicidade.
- Interface de acesso a dados (
br/com/teste/backend/services/ProdutoService.java- Regras de negocio da API.
- Implementa salvar, buscar, listar, atualizar, deletar e baixar estoque.
br/com/teste/backend/controllers/ProdutoController.java- Camada HTTP/REST.
- Expone os endpoints de CRUD e baixa de estoque em
/api/produtos.
br/com/teste/backend/exceptions/ProdutoNaoEncontradoException.java- Excecao para produto inexistente (retorno HTTP 404).
br/com/teste/backend/exceptions/ProdutoJaCadastradoException.java- Excecao para tentativa de duplicidade por nome (retorno HTTP 409).
br/com/teste/backend/exceptions/EstoqueInsuficienteException.java- Excecao para baixa de estoque invalida (retorno HTTP 400).
br/com/teste/backend/BackendApplicationTests.java- Teste de contexto da aplicacao (verifica se o Spring sobe corretamente).
br/com/teste/backend/services/ProdutoServiceTest.java- Testes unitarios da camada de negocio com Mockito (sem banco real).
br/com/teste/backend/controllers/ProdutoControllerIT.java- Testes de integracao da API com MockMvc + Spring context + banco em memoria.
Base: /api/produtos
GET /api/produtos-> lista todosGET /api/produtos/{id}-> busca por idPOST /api/produtos-> cria produtoPUT /api/produtos/{id}-> atualiza produtoDELETE /api/produtos/{id}-> remove produtoPATCH /api/produtos/{id}/estoque-> baixa estoque
Exemplo PATCH body:
{
"quantidadeParaRemover": 3
}- Swagger UI:
http://localhost:8080/swagger-ui/index.html - OpenAPI JSON:
http://localhost:8080/v3/api-docs - H2 Console:
http://localhost:8080/h2-console
Na pasta backend:
./mvnw spring-boot:runNa pasta backend:
- Todos os testes:
./mvnw test- Visualizacao detalhada por metodo, com identificacao de unitario/integracao:
./mvnw -q test-compile exec:java@test-treedeveSalvarProdutoComSucesso- Valida: salva quando nao existe nome duplicado.
- Esperado: produto salvo e
repository.savechamado.
deveLancarExcecaoAoSalvarProdutoComNomeDuplicado- Valida: bloqueia cadastro com mesmo nome.
- Esperado: lancar
ProdutoJaCadastradoExceptione nao chamarsave.
deveLancarExcecaoAoBuscarProdutoInexistente- Valida: busca por id inexistente.
- Esperado: lancar
ProdutoNaoEncontradoException.
deveRemoverEstoqueComSucesso- Valida: baixa estoque no caminho feliz.
- Esperado: estoque reduzido corretamente e
savechamado.
deveLancarExcecaoPorEstoqueInsuficiente- Valida: baixa maior que estoque disponivel.
- Esperado: lancar
EstoqueInsuficienteExceptione nao chamarsave.
deveDeletarProdutoComSucesso- Valida: exclusao de produto existente.
- Esperado:
repository.delete(produto)chamado.
deveCriarProdutoEArmazenarNoBanco- Valida: POST completo da API ate persistencia.
- Esperado: HTTP 201, retorno com
id, registro no banco.
deveListarProdutosIntegradoComBanco- Valida: GET lista refletindo dados persistidos.
- Esperado: HTTP 200 e item retornado no JSON.
deveRetornar404AoBuscarProdutoQueNaoExiste- Valida: tratamento de id inexistente na API.
- Esperado: HTTP 404.
deveDarBaixaNoEstoqueComSucessoIntegrado- Valida: PATCH de estoque e persistencia da alteracao.
- Esperado: HTTP 200 e estoque final atualizado (ex.: 10 -> 7).