Springboot Tdd

affaan-m/ECC/docs/ja-JP/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 的持久化測試。內容也涵蓋斷言風格、測試資料建構器,以及 Maven 或 Gradle 的 CI 指令。
適用情境
適用於在 Spring Boot 服務中新增功能或端點、修正錯誤、重構,或加入資料存取與安全規則邏輯時。適合希望在實作之前先寫測試,並以至少 80% 涵蓋率為目標的團隊。
執行需求
需要具備 JUnit 5、Mockito、MockMvc、Testcontainers 與 JaCoCo 的 Spring Boot 專案,以及 Maven 或 Gradle。Testcontainers 需要 Docker 等容器執行環境。此技能不含指令碼,僅為說明與程式碼範例。

Spring Boot TDD ワークフロー

80%以上のカバレッジ(ユニット+統合)を持つSpring Bootサービスのためのテスト駆動開発ガイダンス。

いつ使用するか

  • 新機能やエンドポイント
  • バグ修正やリファクタリング
  • データアクセスロジックやセキュリティルールの追加

ワークフロー

  1. テストを最初に書く(失敗すべき)
  2. テストを通すための最小限のコードを実装
  3. テストをグリーンに保ちながらリファクタリング
  4. カバレッジを強制(JaCoCo)

ユニットテスト(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());  }}

パターン:

  • Arrange-Act-Assert
  • 部分モックを避ける。明示的なスタビングを優先
  • バリエーションに@ParameterizedTestを使用

Webレイヤーテスト(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());  }}

統合テスト(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());  }}

永続化テスト(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

  • 本番環境を反映するためにPostgres/Redis用の再利用可能なコンテナを使用
  • @DynamicPropertySource経由でJDBC URLをSpringコンテキストに注入

カバレッジ(JaCoCo)

Mavenスニペット:

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>

アサーション

  • 可読性のためにAssertJ(assertThat)を優先
  • JSONレスポンスにはjsonPathを使用
  • 例外には: assertThatThrownBy(...)

テストデータビルダー

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コマンド

  • Maven: mvn -T 4 test または mvn verify
  • Gradle: ./gradlew test jacocoTestReport

覚えておいてください: テストは高速で、分離され、決定論的に保ちます。実装の詳細ではなく、動作をテストします。

來源與署名

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

授權條款: 無授權條款

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

檢舉或申請下架