| name | springboot-tdd |
| description | JUnit 5, Mockito, MockMvc, Testcontainers, JaCoCo를 사용하는 Spring Boot용 테스트 주도 개발 스킬입니다. 기능 추가, 버그 수정, 리팩터링 시 사용합니다. |
| origin | ECC |
Spring Boot TDD Workflow
80% 이상 커버리지를 목표로 하는 Spring Boot 서비스용 TDD 가이드입니다.
사용 시점
- 새 기능 또는 엔드포인트
- 버그 수정 또는 리팩터링
- 데이터 접근 로직이나 보안 규칙 추가
워크플로
- 테스트 먼저 작성(실패해야 함)
- 통과할 최소 코드 구현
- 테스트가 초록인 상태에서 리팩터링
- JaCoCo로 커버리지 강제
단위 테스트
@ExtendWith(MockitoExtension.class)
class MarketServiceTest {
@Mock MarketRepository repo;
@InjectMocks MarketService service;
}
패턴:
- Arrange-Act-Assert
- partial mock 회피
- 변형 케이스는
@ParameterizedTest
Web 레이어 테스트
@WebMvcTest(MarketController.class)
class MarketControllerTest {
@Autowired MockMvc mockMvc;
@MockBean MarketService marketService;
}
통합 테스트
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
class MarketIntegrationTest {
@Autowired MockMvc mockMvc;
}
Persistence 테스트
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(TestContainersConfig.class)
class MarketRepositoryTest {
@Autowired MarketRepository repo;
}
Testcontainers
- Postgres/Redis 같은 재사용 컨테이너로 프로덕션과 유사한 조건 구성
@DynamicPropertySource로 JDBC URL 주입
커버리지
Maven 예시:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
Assertions
- AssertJ의
assertThat
- JSON 응답은
jsonPath
- 예외는
assertThatThrownBy(...)
테스트 데이터 빌더
class MarketBuilder {
private String name = "Test";
MarketBuilder withName(String name) { this.name = name; return this; }
}
CI 명령
- Maven:
mvn -T 4 test 또는 mvn verify
- Gradle:
./gradlew test jacocoTestReport
테스트는 빠르고, 격리되고, 결정론적이어야 합니다. 구현 세부보다 동작을 테스트합니다.