Web/Spring, SpringBoot

Mockito를 이용한 테스트 vs. SpringBootTest의 차이점

조용우 2025. 3. 5. 13:34

테스트를 진행할 때 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 간 연결 문제를 확인하고 싶을 때

🎯 결론

  1. 빠른 테스트가 필요하면 Mockito 기반 단위 테스트를 우선 적용.
  2. 전체 서비스가 정상적으로 동작하는지 검증할 때SpringBootTest 기반 통합 테스트를 사용.
  3. Mock 테스트와 통합 테스트를 함께 사용하면, 빠른 피드백과 안정적인 서비스 검증을 동시에 확보 가능.