Springboot Tdd

affaan-m/ECC/skills/springboot-tdd

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775無授權條款275K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫4 天前更新

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

AI 產生的概覽

指導 Spring Boot 服務的測試驅動開發,使用 JUnit 5、Mockito、MockMvc、Testcontainers 與 JaCoCo。

功能
提供 Spring Boot 的 TDD 工作流程:先撰寫會失敗的測試,再實作最小程式碼,接著重構,最後以 JaCoCo 強制涵蓋率。它提供多種測試範例模式,包括 JUnit 5 與 Mockito 的單元測試、MockMvc 的 Web 層測試、SpringBootTest 的整合測試,以及 DataJpaTest 與 Testcontainers 的持久化測試。內容也涵蓋 AssertJ 斷言、測試資料建構器,以及 Maven 或 Gradle 的 CI 指令。
適用情境
適用於為 Spring Boot 服務新增功能或端點、修正錯誤、重構,或加入資料存取邏輯與安全規則時。對象是希望單元與整合測試涵蓋率達到 80% 以上的團隊。
執行需求
僅為說明文件,不含指令碼。需要 Spring Boot 專案並具備 JUnit 5、Mockito、MockMvc、Testcontainers 與 JaCoCo,以及 Maven 或 Gradle;Testcontainers 需要容器執行環境。

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)

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

Patterns:

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

Web Layer Tests (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());  }}

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

Persistence Tests (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

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

Coverage (JaCoCo)

Maven snippet:

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>

Assertions

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

Test Data Builders

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

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.

來源與署名

來源:affaan-m/ECC位於skills/springboot-tdd提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架