springboot-tdd

affaan-m/everything-claude-code · updated Apr 8, 2026

$npx skills add https://github.com/affaan-m/everything-claude-code --skill springboot-tdd
0 commentsdiscussion
summary

Test-driven development framework for Spring Boot with JUnit 5, Mockito, MockMvc, Testcontainers, and JaCoCo enforcement.

  • Covers unit tests (Mockito), web layer tests (MockMvc), integration tests (SpringBootTest), and persistence tests (DataJpaTest) with concrete examples
  • Integrates Testcontainers for production-mirroring Postgres/Redis databases and JaCoCo for enforcing 80%+ code coverage
  • Emphasizes Arrange-Act-Assert patterns, AssertJ assertions, and test data builders for maintain
skill.md

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.

Discussion

Product Hunt–style comments (not star reviews)
  • No comments yet — start the thread.
general reviews

Ratings

4.835 reviews
  • Lucas Bhatia· Dec 28, 2024

    We added springboot-tdd from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.

  • Dhruvi Jain· Dec 24, 2024

    Keeps context tight: springboot-tdd is the kind of skill you can hand to a new teammate without a long onboarding doc.

  • Anika Haddad· Dec 24, 2024

    I recommend springboot-tdd for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

  • Lucas Bansal· Dec 16, 2024

    Useful defaults in springboot-tdd — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.

  • Anika Sethi· Nov 19, 2024

    springboot-tdd reduced setup friction for our internal harness; good balance of opinion and flexibility.

  • Oshnikdeep· Nov 15, 2024

    springboot-tdd has been reliable in day-to-day use. Documentation quality is above average for community skills.

  • Anika Sharma· Oct 10, 2024

    Registry listing for springboot-tdd matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Ganesh Mohane· Oct 6, 2024

    Solid pick for teams standardizing on skills: springboot-tdd is focused, and the summary matches what you get after install.

  • Sakshi Patil· Sep 25, 2024

    We added springboot-tdd from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.

  • Rahul Santra· Sep 21, 2024

    I recommend springboot-tdd for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

showing 1-10 of 35

1 / 4