# Java 테스트 규칙 ## 테스트 프레임워크 - JUnit 5 + AssertJ 조합 - Mockito로 의존성 모킹 - Spring Boot Test (`@SpringBootTest`) 는 통합 테스트에만 사용 ## 테스트 구조 ### 단위 테스트 (Unit Test) - Service, Util, Domain 로직 테스트 - Spring 컨텍스트 로딩 없이 (`@ExtendWith(MockitoExtension.class)`) - 외부 의존성은 Mockito로 모킹 ```java @ExtendWith(MockitoExtension.class) class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test @DisplayName("사용자 생성 시 정상 저장") void createUser_withValidInput_savesUser() { // given // when // then } } ``` ### 통합 테스트 (Integration Test) - Controller 테스트: `@WebMvcTest` + `MockMvc` - Repository 테스트: `@DataJpaTest` - 전체 플로우: `@SpringBootTest` (최소화) ### 테스트 패턴 - **Given-When-Then** 구조 사용 - 각 섹션을 주석으로 구분 - 하나의 테스트에 하나의 검증 원칙 (가능한 범위에서) ## 테스트 네이밍 - 메서드명: `{메서드}_{시나리오}_{기대결과}` 패턴 - `@DisplayName`: 한국어로 테스트 의도 설명 ## 테스트 커버리지 - 새로 작성하는 Service 클래스: 핵심 비즈니스 로직 테스트 필수 - 기존 코드 수정 시: 수정된 로직에 대한 테스트 추가 권장 - Controller: 주요 API endpoint 통합 테스트 권장 ## 테스트 데이터 - 테스트 데이터는 테스트 메서드 내부 또는 `@BeforeEach`에서 생성 - 공통 테스트 데이터는 TestFixture 클래스로 분리 - 실제 DB 연결 필요 시 H2 인메모리 또는 Testcontainers 사용 ## 금지 사항 - `@SpringBootTest`를 단위 테스트에 사용 금지 - 테스트 간 상태 공유 금지 - `Thread.sleep()` 사용 금지 → `Awaitility` 사용 - 실제 외부 API 호출 금지 → WireMock 또는 Mockito 사용