개발/자바
모킹(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를 활용하면 단위 테스트가 강력해지고 안정성이 높아집니다! 🚀
728x90