All skills
affaan-m avatar

/springboot-tdd

@c70874f

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

Use this Skill: https://skilld.dev/gh/affaan-m/everything-claude-code/springboot-tdd

This session only. Nothing lands on disk.

SKILL.md

≈43 tokens always: the name and description. ≈891 when used: this file.

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.

Source: SKILL.md on GitHub

No alerts3mo5 checks · Risk SAFE
  • Gen Agent Trust Hub3mo

    The skill provides standard documentation and code snippets for implementing Test-Driven Development (TDD) in Spring Boot applications using common industry-standard tools like JUnit 5, Mockito, and JaCoCo. No security issues were detected.

  • Socket3mo

    No alerts

  • Snyk3mo

    Risk: LOW · No issues

  • Runlayer7mo

    1 file scanned · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at c70874f. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 10 hours ago.

Activeupdated 2 days ago
metadata
{
  "origin": "ECC"
}
  • Testing
  • spring-boot
  • junit5
  • mockito
  • mockmvc
  • testcontainers
  • jacoco
  • tdd
  • java
  • integration-tests

README badge

README badge for affaan-m/everything-claude-code/springboot-tdd

Instructs Spring Boot service development using test-driven workflow with JUnit 5, Mockito, MockMvc, and Testcontainers, targeting 80%+ code coverage enforced by JaCoCo. Use for new features, bug fixes, and refactors where tests are written first, then minimal implementation, then refactoring with coverage gates.

Generated from the current SKILL.md.

Does this skill support Gradle projects?
Yes. The skill covers both Maven and Gradle workflows; CI commands for Gradle are included (./gradlew test jacocoTestReport).
What coverage threshold does this enforce?
The skill targets 80%+ coverage across unit and integration tests using JaCoCo, but the specific threshold enforcement is configured in your project's pom.xml or build.gradle.
Can I use this with other testing frameworks like TestNG?
No. The skill is specifically built around JUnit 5, Mockito, MockMvc, and Testcontainers for Spring Boot.
Does this cover testing async code or reactive Spring?
No. The examples and patterns focus on synchronous, servlet-based Spring Boot services.
How do I handle database state between tests?
The skill recommends Testcontainers with reusable containers for Postgres/Redis to mirror production, and wiring them via @DynamicPropertySource to inject connection details into Spring context.

Generated from the current SKILL.md. These answers refresh after source changes.