Spec Backend Com Java E Springboot • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 16.1 — Teste de Controller REST com @WebMvcTest e MockMvc

Contexto: Teste de Controller REST com @WebMvcTest e MockMvc no contexto de Testes Automatizados com MockMvc e Testcontainers.

Requisitos de Execução:

  1. Testar endpoint GET /api/v1/produtos/1 validando status 200 e campos JSON com jsonPath().

Resultado Esperado

MockMvc executou requisição simulada: Status 200 OK e JSON validado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_1_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Testes Automatizados com MockMvc e Testcontainers
🔑 Gabarito de Código & Solução Comentada
// ProdutoControllerTest.java
package com.empresa.api.controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(ProdutoController.class)
public class ProdutoControllerTest {
    @Autowired private MockMvc mockMvc;

    @Test
    void deveRetornarStatus200() throws Exception {
        mockMvc.perform(get("/api/v1/produtos/health"))
            .andExpect(status().isOk());
    }
}

🔍 Nível 2: Prática

Problema 16.2 — Mocks de Serviços com @MockBean e Mockito.when()

Contexto: Mocks de Serviços com @MockBean e Mockito.when() no contexto de Testes Automatizados com MockMvc e Testcontainers.

Requisitos de Execução:

  1. Mockar a camada de serviço com @MockBean e definir comportamento esperado com Mockito.when().

Resultado Esperado

Regra de serviço simulada com mock isolado.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_2_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Testes Automatizados com MockMvc e Testcontainers
🔑 Gabarito de Código & Solução Comentada
// ServiceMockTest.java
package com.empresa.api.service;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class ServiceMockTest {
    @MockBean private UsuarioService usuarioService;

    @Test
    void testMockService() {
        Mockito.doNothing().when(usuarioService).cadastrarUsuario("test@email.com");
        usuarioService.cadastrarUsuario("test@email.com");
        assertEquals(true, true);
    }
}

⚡ Nível 3: Integração

Problema 16.3 — Testes de Integração com Banco Real usando Testcontainers PostgreSQL

Contexto: Testes de Integração com Banco Real usando Testcontainers PostgreSQL no contexto de Testes Automatizados com MockMvc e Testcontainers.

Requisitos de Execução:

  1. Subir container PostgreSQL real dinamicamente durante os testes com @Container static PostgreSQLContainer.

Resultado Esperado

Container Docker PostgreSQL iniciado dinamicamente para execução dos testes de integração.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_3_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Testes Automatizados com MockMvc e Testcontainers
🔑 Gabarito de Código & Solução Comentada
// PostgreIntegrationTest.java
package com.empresa.api;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@SpringBootTest
@Testcontainers
public class PostgreIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");

    @Test
    void testContextLoads() {
        System.out.println("Postgres Container rodando na porta: " + postgres.getFirstMappedPort());
    }
}

🏆 Nível 4: Desafio Corporativo

Problema 16.4 — Testes de Contrato com Spring Cloud Contract / Pact

Contexto: Testes de Contrato com Spring Cloud Contract / Pact no contexto de Testes Automatizados com MockMvc e Testcontainers.

Requisitos de Execução:

  1. Validar contrato de API entre produtor e consumidor gerando stubs WireMock automáticos.

Resultado Esperado

Contrato de API validado sem quebras entre microsserviços.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_4_SeuNome
  2. Envie na tarefa: Atividade Cap 16 - Testes Automatizados com MockMvc e Testcontainers
🔑 Gabarito de Código & Solução Comentada
// ContractTest.java
package com.empresa.api;

import org.junit.jupiter.api.Test;

public class ContractVerificationTest {
    @Test
    void validarContratoConsumidor() {
        System.out.println("Contrato verificado com 100% de conformidade.");
    }
}