Springboot Tdd

affaan-m/ECC/docs/tr/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 工作流,涵盖先编写失败测试、实现最小代码、重构以及强制覆盖率。它给出单元测试(JUnit 5 与 Mockito)、Web 层测试(MockMvc)、集成测试(SpringBootTest)和持久化测试(DataJpaTest 与 Testcontainers)的示例测试模式。它还包含 JaCoCo 的 Maven 配置、断言建议、测试数据构建器以及 Maven 和 Gradle 的 CI 命令。
适用场景
适用于在 Spring Boot 项目中添加新功能或端点、修复缺陷、重构,或添加数据访问逻辑与安全规则时。它面向希望采用结构化 TDD 方法并达到 80% 以上单元与集成覆盖率的开发者。
运行要求
需要一个 Spring Boot 项目,包含 Java、JUnit 5、Mockito、MockMvc、Testcontainers、JaCoCo,以及 Maven 或 Gradle 等构建工具。基于 Testcontainers 的持久化测试需要容器运行时。该技能不附带脚本,仅为说明文档。

Spring Boot TDD İş Akışı

80%+ kapsam (unit + integration) ile Spring Boot servisleri için TDD rehberi.

Ne Zaman Kullanılır

  • Yeni özellikler veya endpoint'ler
  • Bug düzeltmeleri veya refactoring'ler
  • Veri erişim mantığı veya güvenlik kuralları ekleme

İş Akışı

  1. Önce testleri yazın (başarısız olmalılar)
  2. Geçmek için minimal kod uygulayın
  3. Testleri yeşil tutarken refactor edin
  4. Kapsamı zorlayın (JaCoCo)

Unit Testler (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());  }}

Desenler:

  • Arrange-Act-Assert
  • Kısmi mock'lardan kaçının; açık stubbing tercih edin
  • Varyantlar için @ParameterizedTest kullanın

Web Katmanı Testleri (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());  }}

Entegrasyon Testleri (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());  }}

Persistence Testleri (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

  • Production'ı yansıtmak için Postgres/Redis için yeniden kullanılabilir container'lar kullanın
  • JDBC URL'lerini Spring context'e enjekte etmek için @DynamicPropertySource ile bağlayın

Kapsam (JaCoCo)

Maven snippet:

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>

Assertion'lar

  • Okunabilirlik için AssertJ'yi (assertThat) tercih edin
  • JSON yanıtları için jsonPath kullanın
  • Exception'lar için: assertThatThrownBy(...)

Test Veri Builder'ları

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 Komutları

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

Unutmayın: Testleri hızlı, izole ve deterministik tutun. Uygulama detaylarını değil, davranışı test edin.

来源与署名

来源:affaan-m/ECC位于docs/tr/skills/springboot-tdd提交ef648e0

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架