帮助你用 TDD 为 Spring Boot 编写、验证并重构高质量后端代码。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "springboot-tdd" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/skills/springboot-tdd/SKILL.md 2. 保存为 ~/.claude/skills/springboot-tdd/SKILL.md 3. 装好后重载技能,告诉我可以用了
请用 Spring Boot 的 TDD 方式为“创建订单”接口实现完整示例:先写失败的 JUnit 5 和 MockMvc 测试,再写最小可运行控制器、服务与仓储代码,使用 Mockito 模拟依赖,并说明每一步重构点。
一套按 TDD 顺序组织的测试与实现代码,包含测试用例、最小实现和重构说明。
我有一个 Spring Boot 缺陷:当库存为 0 时仍允许下单。请先设计能复现问题的失败测试,再给出修复实现,并补充边界条件测试,使用 JUnit 5 和 Mockito。
包含缺陷复现测试、修复代码与回归测试的完整方案,确保问题不再出现。
请为一个 Spring Boot 用户服务生成基于 Testcontainers 的集成测试示例,使用真实 PostgreSQL 容器验证 Repository 行为,并补充 JaCoCo 覆盖率配置与 Maven 示例。
可直接参考的集成测试代码、容器配置和覆盖率配置示例。
80%+ kapsam (unit + integration) ile Spring Boot servisleri için TDD rehberi.
@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());
}
}
Desenler:
@ParameterizedTest kullanın@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
@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
@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();
}
}
@DynamicPropertySource ile bağlayınMaven snippet:
<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>
assertThat) tercih edinjsonPath kullanınassertThatThrownBy(...)class MarketBuilder {
private String name = "Test";
MarketBuilder withName(String name) { this.name = name; return this; }
Market build() { return new Market(null, name, MarketStatus.ACTIVE); }
}
mvn -T 4 test veya mvn verify./gradlew test jacocoTestReportUnutmayın: Testleri hızlı, izole ve deterministik tutun. Uygulama detaylarını değil, davranışı test edin.
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
帮助开发者为 Quarkus 3.x 服务实施测试驱动开发、修复缺陷并安全重构。