개발/자바

모킹(Mock) 테스트

피터JK 2025. 2. 14. 15:01
728x90

📌 모킹(Mock) 테스트란?

모킹(Mock) 테스트는 실제 객체를 사용하지 않고, 가짜(Mock) 객체를 사용하여 테스트를 수행하는 기법입니다.
특히 외부 시스템(DB, 네트워크, API, 파일 등)에 의존하는 코드를 테스트할 때 유용합니다.


📌 왜 모킹(Mock)이 필요한가?

테스트 속도 향상

  • DB나 API 호출이 필요한 경우, 실제 네트워크 요청 없이 빠르게 테스트 가능

독립적인 단위 테스트 가능

  • 의존성을 제거하고 단일 클래스 또는 메서드만 테스트 가능

외부 서비스 장애에도 영향 없음

  • 외부 시스템이 다운되거나 응답이 느려도 테스트 가능

특정한 상황을 시뮬레이션 가능

  • 예외 발생, 엣지 케이스 등을 쉽게 테스트 가능

📌 모킹(Mock) 프레임워크

1️⃣ Mockito (가장 많이 사용됨)

  • 간단한 API로 모킹 가능
  • when().thenReturn(), verify() 등의 메서드 제공

2️⃣ EasyMock

  • 설정이 많고 조금 복잡하지만 강력한 기능 제공

3️⃣ JMock

  • 인터페이스 중심의 모킹 프레임워크

대부분의 경우 Mockito를 사용하면 충분합니다.


📌 Mockito 기본 사용법

📍 1. @Mock과 @InjectMocks 사용

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class) // Mockito를 JUnit5에서 사용
class OrderServiceTest {

    @Mock // Mock 객체 생성
    private OrderRepository orderRepository;

    @InjectMocks // orderRepository를 자동 주입
    private OrderService orderService;

    @Test
    void testGetOrderById() {
        // given (Mock 객체 설정)
        Order mockOrder = new Order(1, "상품A");
        when(orderRepository.findById(1)).thenReturn(mockOrder);

        // when
        Order order = orderService.getOrderById(1);

        // then (검증)
        assertEquals("상품A", order.getName());
        verify(orderRepository, times(1)).findById(1); // findById가 1번 호출되었는지 검증
    }
}

📍 2. when().thenReturn() 사용 (Mock 데이터 설정)

// when(메서드 호출).thenReturn(리턴값)
when(orderRepository.findById(1)).thenReturn(new Order(1, "상품A"));

📍 3. verify() 사용 (메서드 호출 검증)

// 특정 메서드가 몇 번 호출되었는지 검증
verify(orderRepository, times(1)).findById(1);
verify(orderRepository, never()).delete(1); // delete(1) 호출되지 않았는지 검증

📍 4. 예외 상황 테스트 (thenThrow())

// 예외 발생 테스트
when(orderRepository.findById(999)).thenThrow(new RuntimeException("주문을 찾을 수 없습니다"));

assertThrows(RuntimeException.class, () -> {
    orderService.getOrderById(999);
});

📍 5. 특정 파라미터와 함께 호출 여부 확인 (argumentCaptor)

import org.mockito.ArgumentCaptor;

ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);

// 실행
orderService.getOrderById(1);

// orderRepository.findById()가 호출될 때 어떤 값이 전달되었는지 검증
verify(orderRepository).findById(captor.capture());
assertEquals(1, captor.getValue());

📌 결론

  • 모킹(Mock) 테스트는 실제 객체를 사용하지 않고 가짜 객체로 테스트하는 기법
  • DB, API, 네트워크 등의 의존성을 제거하여 빠르고 독립적인 테스트 가능
  • Mockito를 사용하면 간단하게 모킹할 수 있음 (when().thenReturn(), verify() 등)
  • 예외 상황 및 특정 호출 여부까지 검증 가능

💡 Mockito를 활용하면 단위 테스트가 강력해지고 안정성이 높아집니다! 🚀

 

2025.02.14 - [개발/자바] - JUnit 4 vs JUnit 5 어노테이션 비교

728x90