Spring

Spring Boot 테스트, Mocking이란?

윤승 2025. 5. 1. 19:48
테스트 코드는 왜 필수일까?

 

소프트웨어 개발을 하다 보면 새로운 기능을 추가하거나, 기존 로직을 수정해야 하는 순간이 많아진다.
그때마다 예상치 못한 버그가 생길 가능성도 커지기 때문에 테스트 코드는 바로 그 위험을 미리 방지하는 역할을 한다.

 

 

✅  테스트의 3가지 장점

  1. 신뢰성 향상
    → 기능 추가/수정 후에도 기존 기능이 정상 동작하는지 빠르게 확인 가능
  2. 코드 이해도 증가
    → 테스트는 코드의 사용법을 보여주는 살아있는 문서
  3. 장기적 비용 절감
    → 초반 테스트 작성은 비용이 들지만, 나중에 디버깅·유지보수 비용을 줄여준다

 

✅  단위 테스트 vs 통합 테스트

 

💡 통합 테스트는 실제 HTTP 요청을 보내고, DB 결과까지 확인함으로써, 시스템이 현실처럼 동작하는지 검증할 수 있고,
단위 테스트는 쉽게 말해. 실제 DB없이 UserRepository를 Mock로 대체해  UserService 로직만 독립적으로 검증한다.

 

 

단위 테스트 예시

  • 의부 의존성은 모두 Mock으로 대체
  • 메서드, 클래스 단위로 로직만 검증
@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    void 사용자조회_성공() {
        // Given
        User mockUser = new User("user1", "user1@email.com");
        given(userRepository.findByEmail("user1@email.com")).willReturn(Optional.of(mockUser));

        // When
        User result = userService.findByEmail("user1@email.com");

        // Then
        assertEquals("user1", result.getName());
    }
}

 

통합 테스트 예시

  • 실제 시스템 흐름(Controller → Service → DB)이 정상 작동하는지 확인
  • 실제 DB(H2 등)와 연동. 실행 시간이 비교적 길지만 전체 흐름 검증 가능

 

✅  여기서 Mocking이란?

Mocking은 테스트 대상이 아닌 외부 의존 객체를 가짜(Mock) 객체로 대체하는 기술이다.
즉, 외부 시스템에 의존하는 객체를 "진짜처럼 흉내낸 객체"로 바꿔 테스트하는 기법이다. 

 

 

✅  왜 Mocking이 필요할까?

 

예를 들어 UserService가 UserRepository를 사용하는 경우, UserRepository가 실제 DB와 연결되어야지 메서드를 테스트할 수 있다.
하지만 Mocking을 사용하면 진짜 DB 대신 가짜 UserRepository를 만들어서 특정 이메일이 들어오면 이 유저를 주는 것처럼 사용할 수 있다. 

 

✅  실제 Mocking 코드 예시

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock
    private UserRepository userRepository;  // 진짜 대신 가짜

    @InjectMocks
    private UserService userService;

    @Test
    void 유저조회_성공() {
        // given
        given(userRepository.findByEmail("test@email.com"))
            .willReturn(Optional.of(new User("홍길동", "test@email.com")));

        // when
        User result = userService.findByEmail("test@email.com");

        // then
        assertEquals("홍길동", result.getName());
    }
}

 

 

  • findByEmail(...) 호출 시 → DB에 접근하는 게 아니라
  • given(...)으로 설정한 가짜 응답값이 바로 리턴된다.

 

 

Mocking은 외부 의존성을 제거하고, 테스트 대상 로직만 정확하게 검증할 수 있게 도와주는 강력한 테스트 기법이다.

 

 

✅  단위 테스트, 통합 테스트 마무리 정리

구분 단위 테스트  통합 테스트
목적 비즈니스 로직 검증 시스템 전체 흐름 검증
실행 속도 빠름 상대적으로 느림
사용 도구 Mockito, JUnit MockMvc, 실제 DB
특징 외부 의존성 Mock 처리 실제 환경 그대로 검증