---
name: springboot-tdd
description: 使用 JUnit 5, Mockito, MockMvc, Testcontainers 與 JaCoCo 進行 Spring Boot 的測試驅動開發 (TDD)。適用於功能開發、臭蟲修復或重構時。
---

# Spring Boot TDD 工作流 (Spring Boot TDD Workflow)

針對 Spring Boot 服務的 TDD 指引，旨在達成 80% 以上的測試覆蓋率（單元測試 + 整合測試）。

## 何時使用

- 開發新功能或 API 端點。
- 修復 Bug 或進行程式碼重構。
- 添加資料存取邏輯 (Data Access) 或安全性規則。

## 標準工作流

1. **先寫測試 (RED)**：撰寫會失敗的測試案例。
2. **實作功能 (GREEN)**：編寫最少量的程式碼使測試通過。
3. **重構優化 (REFACTOR)**：在測試通過的前提下優化程式碼架構。
4. **檢查覆蓋率 (JaCoCo)**：確保關鍵路徑覆蓋完整。

## 測試策略與工具

### 單元測試 (Unit Tests)
- **工具**：JUnit 5 + Mockito。
- **模式**：Arrange-Act-Assert (AAA)。
- **重點**：使用 `@Mock` 與 `@InjectMocks` 隔離外部依賴，專注於 Service 邏輯。

### Web 層測試 (Web Layer Tests)
- **工具**：`@WebMvcTest` + `MockMvc`。
- **重點**：針對 Controller 進行輕量級測試，驗證 HTTP 狀態碼與 JSON 回應格式（使用 `jsonPath`）。

### 整合測試 (Integration Tests)
- **工具**：`@SpringBootTest` + `@AutoConfigureMockMvc`。
- **重點**：啟動完整的 Spring 上下文與真實的資料庫進行端到端流量測試。

### 持久層測試 (Persistence Tests)
- **工具**：`@DataJpaTest` + Testcontainers。
- **重點**：使用 **Testcontainers** 啟動真實的資料庫鏡像（如 Postgres），取代 H2 記憶體資料庫，以模擬真實生產環境。

## 覆蓋率與斷言

- **檢查工具**：JaCoCo。目標 80%+，關鍵路徑 100%。
- **斷言工具**：優先選用 **AssertJ** (`assertThat`) 以提升閱讀性。
- **例外測試**：使用 `assertThatThrownBy(...)`。

## 常用指令

- **Maven**：`mvn verify` (執行測試並產出覆蓋率報告)。
- **Gradle**：`./gradlew test jacocoTestReport`。

---

**核心原則**：保持測試速度快、具備隔離性且結果具備確定性 (Deterministic)。測試應專注於「行為」而非「實作細節」。
