Catalog
affaan-m/springboot-tdd

affaan-m

springboot-tdd

Test-driven development for Spring Boot using JUnit 5, Mockito, MockMvc, Testcontainers, and JaCoCo. Use when adding features, fixing bugs, or refactoring.

global
origin:ECC
New~930
v1.2Saved Jul 14, 2026

Spring Boot TDD Workflow

TDD guidance for Spring Boot services with 80%+ coverage (unit + integration).

When to Use

  • New features or endpoints
  • Bug fixes or refactors
  • Adding data access logic or security rules

Workflow

  1. Write tests first (they should fail)
  2. Implement minimal code to pass
  3. Refactor with tests green
  4. Enforce coverage (JaCoCo)

Unit Tests (JUnit 5 + Mockito)

@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());
  }
}

Patterns:

  • Arrange-Act-Assert
  • Avoid partial mocks; prefer explicit stubbing
  • Use @ParameterizedTest for variants

Web Layer Tests (MockMvc)

@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());
  }
}

Integration Tests (SpringBootTest)

@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());
  }
}

Persistence Tests (DataJpaTest)

@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

  • Use reusable containers for Postgres/Redis to mirror production
  • Wire via @DynamicPropertySource to inject JDBC URLs into Spring context

Coverage (JaCoCo)

Maven snippet:

<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>

Assertions

  • Prefer AssertJ (assertThat) for readability
  • For JSON responses, use jsonPath
  • For exceptions: assertThatThrownBy(...)

Test Data Builders

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

CI Commands

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

Remember: Keep tests fast, isolated, and deterministic. Test behavior, not implementation details.

Files1
1 files · 1.0 KB

Select a file to preview

Overall Score

86/100

Grade

A

Excellent

Safety

95

Quality

83

Clarity

88

Completeness

81

Summary

Comprehensive test-driven development guidance for Spring Boot services using JUnit 5, Mockito, MockMvc, Testcontainers, and JaCoCo. The skill provides structured patterns for unit, integration, persistence, and web layer testing with examples and best practices to achieve 80%+ code coverage.

Detected Capabilities

code analysis and pattern documentationMaven and Gradle configuration guidanceJava test framework usageno file writesno shell executionno external network requests

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

spring boot testingjunit 5 unit testsmock mvc integrationtestcontainers setupjacoco coveragetest driven developmentmockito patternsspring test configuration

Use Cases

  • Add new Spring Boot features with test-first approach
  • Write unit tests for service and repository layers
  • Create integration tests for REST endpoints
  • Set up and run database tests with Testcontainers
  • Configure JaCoCo code coverage reporting
  • Refactor existing code with test safety nets
  • Fix bugs by writing failing tests first
  • Establish consistent test patterns across team

Quality Notes

  • Excellent use of realistic, copy-paste-ready code examples across all test layers
  • Clear workflow structure (write tests → implement → refactor) follows TDD best practices
  • Well-documented patterns avoid anti-patterns (e.g., avoiding partial mocks, preferring explicit stubbing)
  • Includes concrete Maven and Gradle commands for CI integration
  • Uses industry-standard libraries (JUnit 5, Mockito, AssertJ) with modern annotations
  • Testcontainers guidance shows practical database testing without mocking
  • Test data builder pattern example demonstrates maintainability
  • Addresses both unit and integration testing with appropriate scope separation
  • Concise and actionable assertions guidance with multiple assertion styles
  • Missing some edge case coverage documentation (e.g., timeout handling, flaky test mitigation)
  • No guidance on test organization or naming conventions beyond example class names
  • Limited discussion of performance considerations for large test suites
Model: claude-haiku-4-5-20251001Analyzed: Jul 14, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

v1.2

Content updated

2026-07-14

Latest
v1.1

Content updated

2026-04-20

v1.0

Seeded from github.com/affaan-m/everything-claude-code

2026-03-16

Use affaan-m/springboot-tdd in your dev environment

Command Palette

Search for a command to run...