728x90
스프링 부트 단위 테스트 기본 개념
구분 |
설명 |
단위 테스트(Unit Test) | 특정 클래스(컨트롤러, 서비스, 리포지토리)를 독립적으로 테스트 |
통합 테스트(Integration Test) | 실제 스프링 애플리케이션 컨텍스트를 로딩해 전체 구성 요소를 테스트 |
1. @WebMvcTest – 컨트롤러 단위 테스트
목적
- Controller 레이어만 테스트
- 서비스, DB 등은 Mock으로 처리
예제
@WebMvcTest(MemberController.class)
class MemberControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private MemberService memberService;
@Test
void getMember_응답_200() throws Exception {
MemberDto dto = new MemberDto("홍길동", "test@example.com");
given(memberService.getMember(1L)).willReturn(dto);
mockMvc.perform(get("/api/member/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("홍길동"));
}
}
핵심 요소
어노테이션 | 설명 |
@WebMvcTest | 컨트롤러만 빈 등록 |
MockMvc | HTTP 요청/응답 시뮬레이션 |
@MockBean | 외부 의존성을 가짜로 주입 (Service, Repository 등) |
jsonPath() | JSON 응답 내용 검증 |
2. @DataJpaTest – JPA 레이어 단위 테스트
목적
- JPA 엔티티 & 리포지토리 테스트
- DB 연동 테스트 (보통 H2)
예제
@DataJpaTest
class MemberRepositoryTest {
@Autowired
private MemberRepository memberRepository;
@Test
void 이메일로_회원_조회() {
Member member = new Member("danbi", "danbi@example.com");
memberRepository.save(member);
Optional<Member> result = memberRepository.findByEmail("danbi@example.com");
assertTrue(result.isPresent());
assertEquals("danbi", result.get().getName());
}
}
핵심 요소
어노테이션 | 설명 |
@DataJpaTest | JPA 관련 빈만 로딩, H2 메모리 DB 사용 |
@AutoConfigureTestDatabase | 실제 DB 사용 시 설정 필요 |
@Sql | 테스트 전후 SQL 실행 |
테스트 환경 설정
application.yml (테스트 전용)
spring:
datasource:
url: jdbc:h2:mem:testdb
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
단위 테스트에서 H2 DB를 사용하면 빠르고 독립적으로 테스트할 수 있습니다.
마무리 요약
구분 | @WebMvcTest | @DataJpaTest |
목적 | 컨트롤러 레이어 테스트 | JPA/DB 테스트 |
로딩 범위 | Controller + MockMvc | Repository + H2 DB |
의존성 주입 | @MockBean 사용 | 실제 JPA 구성 요소 자동 주입 |
사용 예 | GET/POST 요청 테스트 | CRUD, 쿼리 메서드 검증 |
통합 테스트 어노테이션
어노테이션 | 설명 |
@SpringBootTest | 실제 앱처럼 전체 로딩 (통합 테스트) |
@Transactional | 테스트 후 롤백 (데이터 초기화) |
LIST
'SpringBoot > 테스트와 품질 관리' 카테고리의 다른 글
테스트 데이터 준비 (@Sql, Testcontainers) (0) | 2025.04.15 |
---|---|
통합 테스트 (@SpringBootTest) (0) | 2025.04.15 |