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

springboot-tdd

使用 JUnit 5、Mockito、MockMvc、Testcontainers 和 JaCoCo 进行 Spring Boot 的测试驱动开发 (TDD)。在添加功能、修复 Bug 或进行重构时使用。

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

설치 방법 보기

포함된 파일(1)

  • SKILL.md3.8 KB

SKILL.md(원문)

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

Spring Boot TDD 工作流

针对具有 80% 以上覆盖率(单元测试 + 集成测试)的 Spring Boot 服务的 TDD 指南。

适用场景

  • 新功能或 API 端点开发
  • Bug 修复或重构
  • 添加数据访问逻辑或安全规则

工作流

  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)
  • 避免部分 Mock;优先使用显式打桩 (Stubbing)
  • 使用 @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>

断言 (Assertions)

  • 为了提高可读性,优先使用 AssertJ (assertThat)
  • 对于 JSON 响应,使用 jsonPath
  • 对于异常: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 命令

  • Maven: mvn -T 4 test 或 mvn verify
  • Gradle: ./gradlew test jacocoTestReport

记住:保持测试快速、隔离且具有确定性。测试行为,而不是实现细节。

리뷰

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

댓글

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

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

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

0 / 1,000자

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

같은 저장소의 스킬

REST API设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和生产API的速率限制。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

生产级 API 的 REST API 设计模式,包括资源命名、状态码、分页、过滤、错误响应、版本控制和速率限制。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

根据提供的示例或品牌指导,以独特的语气撰写文章、指南、博客帖子、教程、新闻简报等长篇内容。当用户需要超过一段的精致书面内容时使用,尤其是当语气一致性、结构和可信度至关重要时。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

撰写文章、指南、博客、教程、时事通讯等长篇内容,并根据提供的示例或品牌指南呈现独特的语言风格。当用户需要篇幅超过一段的精炼文字,且重视风格一致性、结构和可信度时,请使用此技能。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

编写文章、指南、博客帖子、教程、新闻通讯(newsletter)以及其他长篇内容。这些内容具有从提供的示例或品牌指南中提取出的独特语气。当用户需要比段落更长的精美文案,且对语气一致性、结构和可信度有要求时,请使用此技能(Skill)。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

编写文章、指南、博客、教程、时事通讯(Newsletter)等长内容,支持从示例或品牌指南中提取独特的语感语调。适用于需要撰写超过一个段落的精炼文本,尤其是对语气一致性、结构和可信度有较高要求时。

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

xu-xiang/everything-claude-code-zh2천2026년 3월 5일 업데이트

xu-xiang의 스킬 모두 보기

이 스킬의 문제 신고