테스트를 진행할 때 Mockito 기반의 단위 테스트(Unit Test) 와 SpringBootTest 기반의 통합 테스트(Integration Test) 는 각기 다른 목적과 장점이 있습니다.
1️⃣ Mockito를 이용한 단위 테스트 (Unit Test)
💡 목표:
- 특정 클래스의 동작이 개별적으로 올바르게 동작하는지 검증.
- Spring 컨텍스트를 로드하지 않고 빠르게 테스트 실행.
- Mock 객체를 사용하여 실제 데이터베이스와의 상호작용을 차단.
💡 특징:
✅ Spring의 컨텍스트를 사용하지 않으므로 테스트 속도가 빠름
✅ Mock 객체를 이용하여 DB 등의 외부 의존성을 제거 (테스트가 독립적)
✅ 특정 메서드가 의도한 대로 동작하는지 세밀하게 검증 가능
💡 Mock 객체 (@Mock)
- postRepository.save(any(Post.class))을 직접 실행하지 않고, when().thenReturn()을 통해 가상의 응답을 반환.
💡 InjectMocks (@InjectMocks)
- PostService 내부에서 postRepository와 userService를 사용하므로, Mock 객체를 주입하여 테스트.
2️⃣ SpringBootTest를 이용한 통합 테스트 (Integration Test)
💡 목표:
- 실제 Spring 컨텍스트, 데이터베이스, DI(의존성 주입)과 함께 올바르게 동작하는지 검증.
- 실제 Bean을 주입받아 서비스의 전반적인 기능을 테스트.
- JPA를 활용하여 실제 DB와 상호작용.
💡 특징:
✅ Spring 컨텍스트와 함께 동작 → 실제 @Service, @Repository, @Autowired 등을 활용
✅ H2 같은 인메모리 데이터베이스를 활용하여 JPA가 올바르게 동작하는지 확인 가능
✅ 여러 Bean이 실제로 조합될 때 발생할 수 있는 문제를 확인할 수 있음
❌ 테스트 속도가 Mock 테스트보다 상대적으로 느림
💡 Spring 컨텍스트 (@SpringBootTest)
- 실제 @Repository, @Service를 사용하여 동작을 확인.
💡 트랜잭션 롤백 (@Transactional)
- 테스트가 끝난 후 DB에 저장된 데이터를 자동으로 롤백하여 다음 테스트에 영향을 주지 않음.
📌 Mockito 기반 단위 테스트 vs. SpringBootTest 기반 통합 테스트
Mockito 단위 테스트SpringBootTest 통합 테스트
목적 | 특정 클래스의 기능 검증 | 서비스가 전체적으로 동작하는지 검증 |
실제 DB 사용 여부 | ❌ (Mock 사용) | ✅ (H2 인메모리 DB 사용 가능) |
Spring 컨텍스트 사용 여부 | ❌ 사용하지 않음 | ✅ 사용함 |
속도 | 🚀 빠름 | 🐢 느림 (Spring 부팅 필요) |
의존성 | Mock 객체를 주입하여 테스트 | 실제 @Autowired 및 JPA를 사용 |
테스트 대상 | 개별 메서드 | 서비스 계층 전체 |
🔥 언제 어떤 테스트를 사용해야 할까?
✅ Mockito 단위 테스트 사용
- 특정 비즈니스 로직을 테스트할 때
- DB 의존성을 피하고 빠르게 테스트할 때
- 독립적인 클래스 로직을 검증하고 싶을 때
✅ SpringBootTest 통합 테스트 사용
- 전체 애플리케이션의 흐름이 정상적으로 동작하는지 검증할 때
- JPA를 이용한 쿼리 로직을 확인할 때
- Spring의 Bean 간 연결 문제를 확인하고 싶을 때
🎯 결론
- 빠른 테스트가 필요하면 Mockito 기반 단위 테스트를 우선 적용.
- 전체 서비스가 정상적으로 동작하는지 검증할 때는 SpringBootTest 기반 통합 테스트를 사용.
- Mock 테스트와 통합 테스트를 함께 사용하면, 빠른 피드백과 안정적인 서비스 검증을 동시에 확보 가능.
'Web > Spring, SpringBoot' 카테고리의 다른 글
Spring @ModelAttribute 매핑 오류 해결 방법 (Setter, Enum 변환) (0) | 2025.03.20 |
---|---|
Spring Data JPA에서 커스텀 Repository 구현체 인식 및 작동 방식 (0) | 2025.03.20 |
스프링 부트 테스트 시 JPA Auditing 에러 (0) | 2025.03.12 |
application.properties 민감한 정보 보호하는 방법 (0) | 2025.02.13 |
Spring boot 프로젝트 설정 (0) | 2023.04.09 |