affaan-m/ECC

springboot-tdd

Review springboot-tdd's use cases, installation, workflow, and original source instructions.

71Collecting
See how to use itView GitHub source
npx skills add https://github.com/affaan-m/ECC --skill "docs/zh-CN/skills/springboot-tdd"
Automated source guideDocumentationStandard source

Source checked Jul 28, 2026·Refresh due Oct 26, 2026

Reorganized from the pinned upstream SKILL.md

Source-grounded documentation guide: springboot-tdd

适用于 Spring Boot 服务、覆盖率 80%+(单元 + 集成)的 TDD 指南。

npx skills add https://github.com/affaan-m/ECC --skill "docs/zh-CN/skills/springboot-tdd"
Check the pinned source

The pinned source supports a structured brief, but not an expanded tutorial. Only detected inputs, outputs, and sections are shown.

268 source words · 11 usable sections

Documentation workflow

Read springboot-tdd through these 4 source sections

Sections are extracted automatically from the pinned SKILL.md and link back to the source.

01

何时使用

新功能或端点 错误修复或重构 添加数据访问逻辑或安全规则

SKILL.md · 何时使用
新功能或端点错误修复或重构添加数据访问逻辑或安全规则
02

工作流程

1. 先写测试(它们应该失败) 2. 实现最小代码以通过测试 3. 在测试通过后进行重构 4. 强制覆盖率(JaCoCo)

SKILL.md · 工作流程
先写测试(它们应该失败)实现最小代码以通过测试在测试通过后进行重构
03

单元测试 (JUnit 5 + Mockito)

Arrange-Act-Assert 避免部分模拟;优先使用显式桩 使用 @ParameterizedTest 处理变体

SKILL.md · 单元测试 (JUnit 5 + Mockito)
Arrange-Act-Assert避免部分模拟;优先使用显式桩使用 @ParameterizedTest 处理变体
04

Web 层测试 (MockMvc)

Review the “Web 层测试 (MockMvc)” section in the pinned source before continuing.

SKILL.md · Web 层测试 (MockMvc)
Review and apply the “Web 层测试 (MockMvc)” source section.

Documentation checklist

Verify each item before delivery

The source section “何时使用” has been checked.

The source section “工作流程” has been checked.

The source section “单元测试 (JUnit 5 + Mockito)” has been checked.

The source section “Web 层测试 (MockMvc)” has been checked.

Choose a different workflow

When another Skill is the better fit

FAQ

What does the springboot-tdd source document cover?

适用于 Spring Boot 服务、覆盖率 80%+(单元 + 集成)的 TDD 指南。

How do I install springboot-tdd?

The source record exposes this install command: npx skills add https://github.com/affaan-m/ECC --skill "docs/zh-CN/skills/springboot-tdd". Inspect the command and pinned source before running it.

Repository stars
234,327
Repository forks
35,711
Quality
71/100
Source repository last pushed

Quality breakdown

Based on traceable docs and repository signals; stars are not treated as quality.

71/100
Documentation21/30
Specificity18/25
Maintenance20/20
Trust signals12/25
View original Skill.mdThis page is parsed directly from the repository SKILL.md without editorial rewriting. Collected: Jul 28, 2026 · about 1 min

Spring Boot TDD 工作流程

适用于 Spring Boot 服务、覆盖率 80%+(单元 + 集成)的 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 testmvn verify
  • Gradle: ./gradlew test jacocoTestReport

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

Source repo
affaan-m/ECC
Skill path
docs/zh-CN/skills/springboot-tdd/SKILL.md
Commit SHA
4e973d3eaf92
Repository license
MIT
Data collected