본문으로 건너뛰기
cccskills
무료GitHub에 공개

springboot-tdd

JUnit 5、Mockito、MockMvc、Testcontainers、JaCoCoを使用したSpring Bootのテスト駆動開発。機能追加、バグ修正、リファクタリング時に使用。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md4.2 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Spring Boot TDDワークフロー

80%以上のカバレッジ(ユニット+統合)を目指すSpring BootサービスのTDDガイダンス。

使用タイミング

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

ワークフロー

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

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

パターン:

  • Arrange-Act-Assert
  • 部分モックを避ける;明示的なスタビングを優先
  • バリアントには@ParameterizedTestを使用

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

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

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

  • Postgres/Redisの再利用可能なコンテナを使用してプロダクションを再現
  • @DynamicPropertySource経由でJDBC URLをSpringコンテキストに注入

カバレッジ(JaCoCo)

Mavenスニペット:

<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(...)

テストデータビルダー

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

覚えておくべきこと: テストは高速で、分離され、決定論的に保ちましょう。実装の詳細ではなく、振る舞いをテストしてください。

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

コーディングエージェント(Claude Code、Aider、Codexなど)のカスタムタスクによる直接比較。合格率、コスト、時間、一貫性メトリクスを測定

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

AIエージェントのアクションスペース、ツール定義、オブザベーションフォーマットを設計・最適化し、タスク完了率を向上させる

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

評価ファーストの実行、分解、コスト考慮型モデルルーティングによるエージェンティックエンジニアとしての運用

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

AIエージェントが実装出力の大部分を生成するチームのためのエンジニアリング運用モデル

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

AI支援開発のためのリグレッションテスト戦略。データベース依存なしのサンドボックスモードAPIテスト、自動バグチェックワークフロー、同一モデルがコードの作成とレビューを行う際のAIの盲点を検出するパターン。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

AndroidおよびKotlin Multiplatformプロジェクトのためのクリーンアーキテクチャパターン — モジュール構成、依存関係ルール、UseCase、Repository、データレイヤーパターン

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

hage-oyaji/everything-claude-code-jp-local32026년 3월 29일 업데이트

hage-oyaji의 스킬 모두 보기

이 스킬의 문제 신고