Springboot Tdd

by affaan-mef648e01899bNo license275K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 days ago

Desarrollo guiado por pruebas para Spring Boot usando JUnit 5, Mockito, MockMvc, Testcontainers y JaCoCo. Usar al agregar funcionalidades, corregir bugs o refactorizar.

Instructions onlySoftware Development
AI-generated overview

Guides test-driven development for Spring Boot services using JUnit 5, Mockito, MockMvc, Testcontainers and JaCoCo.

What it does
Provides a TDD workflow for Spring Boot projects: write failing tests first, implement minimal code, refactor, and enforce coverage with JaCoCo. It supplies example test patterns for unit tests, web-layer tests with MockMvc, integration tests with SpringBootTest, and persistence tests with DataJpaTest and Testcontainers. It also covers AssertJ assertions, test data builders, and CI commands for Maven and Gradle.
When to use it
Use it when adding new features or endpoints, fixing bugs, or refactoring Spring Boot services. It is also intended for adding data-access logic or security rules where tests should come first.
Requirements
Instructions only; no scripts are shipped. It assumes a Spring Boot project with JUnit 5, Mockito, MockMvc, Testcontainers, JaCoCo, AssertJ, and a build tool such as Maven or Gradle. Testcontainers requires a container runtime, and CI commands need network access to fetch dependencies.

Flujo de Trabajo TDD en Spring Boot

Orientación TDD para servicios Spring Boot con 80%+ de cobertura (unit + integración).

Cuándo Usar

  • Nuevas funcionalidades o endpoints
  • Correcciones de bugs o refactorizaciones
  • Agregar lógica de acceso a datos o reglas de seguridad

Flujo de Trabajo

  1. Escribir pruebas primero (deben fallar)
  2. Implementar el código mínimo para que pasen
  3. Refactorizar con pruebas en verde
  4. Exigir cobertura con JaCoCo

Pruebas Unitarias (JUnit 5 + Mockito)

java
@ExtendWith(MockitoExtension.class)class MarketServiceTest {  @Mock MarketRepository repo;  @InjectMocks MarketService service;
  @Test  void createsMarket() {    CreateMarketRequest req = new CreateMarketRequest("name", "desc", Instant.now(), List.of("cat"));    when(repo.save(any())).thenAnswer(inv -> inv.getArgument(0));
    Market result = service.create(req);
    assertThat(result.name()).isEqualTo("name");    verify(repo).save(any());  }}

Patrones:

  • Arrange-Act-Assert
  • Evitar mocks parciales; preferir stubbing explícito
  • Usar @ParameterizedTest para variantes

Pruebas de Capa Web (MockMvc)

java
@WebMvcTest(MarketController.class)class MarketControllerTest {  @Autowired MockMvc mockMvc;  @MockBean MarketService marketService;
  @Test  void returnsMarkets() throws Exception {    when(marketService.list(any())).thenReturn(Page.empty());
    mockMvc.perform(get("/api/markets"))        .andExpect(status().isOk())        .andExpect(jsonPath("$.content").isArray());  }}

Pruebas de Integración (SpringBootTest)

java
@SpringBootTest@AutoConfigureMockMvc@ActiveProfiles("test")class MarketIntegrationTest {  @Autowired MockMvc mockMvc;
  @Test  void createsMarket() throws Exception {    mockMvc.perform(post("/api/markets")        .contentType(MediaType.APPLICATION_JSON)        .content("""          {"name":"Test","description":"Desc","endDate":"2030-01-01T00:00:00Z","categories":["general"]}        """))      .andExpect(status().isCreated());  }}

Pruebas de Persistencia (DataJpaTest)

java
@DataJpaTest@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)@Import(TestContainersConfig.class)class MarketRepositoryTest {  @Autowired MarketRepository repo;
  @Test  void savesAndFinds() {    MarketEntity entity = new MarketEntity();    entity.setName("Test");    repo.save(entity);
    Optional<MarketEntity> found = repo.findByName("Test");    assertThat(found).isPresent();  }}

Testcontainers

  • Usar contenedores reutilizables para Postgres/Redis que reflejen producción
  • Conectar mediante @DynamicPropertySource para inyectar URLs JDBC en el contexto de Spring

Cobertura (JaCoCo)

Fragmento Maven:

xml
<plugin>  <groupId>org.jacoco</groupId>  <artifactId>jacoco-maven-plugin</artifactId>  <version>0.8.14</version>  <executions>    <execution>      <goals><goal>prepare-agent</goal></goals>    </execution>    <execution>      <id>report</id>      <phase>verify</phase>      <goals><goal>report</goal></goals>    </execution>  </executions></plugin>

Aserciones

  • Preferir AssertJ (assertThat) para legibilidad
  • Para respuestas JSON, usar jsonPath
  • Para excepciones: assertThatThrownBy(...)

Builders de Datos de Prueba

java
class MarketBuilder {  private String name = "Test";  MarketBuilder withName(String name) { this.name = name; return this; }  Market build() { return new Market(null, name, MarketStatus.ACTIVE); }}

Comandos de CI

  • Maven: mvn -T 4 test o mvn verify
  • Gradle: ./gradlew test jacocoTestReport

Recuerda: Mantener las pruebas rápidas, aisladas y deterministas. Probar comportamiento, no detalles de implementación.

Source and attribution

Source:affaan-m/eccindocs/es/skills/springboot-tddat commitef648e0

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal