Mockito 가 뭔데?
Java 프로젝트의 테스트 코드를 작성할 때 사용할 수 있는 다양한 테스트 방식들이 있다.
@SpringBootTest, @SpringMvcTest, @DataJpaTest 등등
그 중에서 많이 사용되고 있는 Mockito 관련 내용을 정리를 해 보자
1. Mockito란?
Mockito는 Java 애플리케이션을 위한 오픈소스 모킹 프레임워크이다.
Mock 이라는 말은 흉내낸다는 말을 담고 있다.
Mock이라는 객체를 만들어서 어떤 객체의 동작을 수행하는 것처럼 흉내내는 것을 의미한다.
단위 테스트를 작성할 때 객체의 동작을 시뮬레이션하고 검증하는 데 사용된다.
Mockito를 사용하면 복잡한 의존성을 가진 코드도 쉽게 테스트할 수 있으며, 테스트 더블(Test Double)을 만들어 실제 객체를 대체할 수 있다.
2. Mockito의 장점 및 사용 시기
장점:
간단한 API: Mockito는 직관적이고 사용하기 쉬운 API를 제공한다.
높은 유연성: 다양한 시나리오에 대한 모의 객체를 쉽게 생성하고 구성할 수 있다.
가독성: Mockito를 사용한 테스트 코드는 읽기 쉽고 이해하기 쉽다.
통합의 용이성: JUnit과 같은 다른 테스팅 프레임워크와 쉽게 통합된다.
강력한 검증 기능: 메소드 호출, 인자, 호출 순서 등을 세밀하게 검증할 수 있다.
그러면 언제 사용할까?
외부 의존성이 있는 경우: 데이터베이스, 웹 서비스 등 외부 시스템에 의존하는 코드를 테스트할 때
복잡한 객체 그래프: 복잡한 객체 관계를 가진 코드를 테스트할 때
특정 상황 시뮬레이션: 예외 상황이나 특정 시나리오를 테스트해야 할 때
레거시 코드 테스트: 기존 코드를 수정하지 않고 테스트를 추가해야 할 때
3. 자주 사용되는 함수 모음 및 예시
1) mock() - 모의 객체 생성
List<String> mockedList = mock(List.class);
2) when().thenReturn() - 특정 동작 정의
when(mockedList.get(0)).thenReturn("first");
System.out.println(mockedList.get(0)); // 출력: first
3) verify() - 메소드 호출 검증
mockedList.add("one");
verify(mockedList).add("one");
4) anyInt(), anyString() 등 - 인자 매칭
when(mockedList.get(anyInt())).thenReturn("element");
5) doThrow() - 예외 발생 시뮬레이션
doThrow(new RuntimeException()).when(mockedList).clear();
mockedList.clear(); // RuntimeException 발생
예시: UserService 테스트
@Test
public void testGetUserById() {
// Given
UserRepository mockRepository = mock(UserRepository.class);
UserService userService = new UserService(mockRepository);
User expectedUser = new User(1L, "홍길동");
when(mockRepository.findById(1L)).thenReturn(Optional.of(expectedUser));
// When
User actualUser = userService.getUserById(1L);
// Then
assertEquals(expectedUser, actualUser);
verify(mockRepository).findById(1L);
}
4. Mockito의 단점
하지만 Mockito도 만능은 아니다
런타임 동작에 의존: Mockito는 런타임에 동작하므로, 컴파일 시점에 발견되지 않는 오류가 있을 수 있다.
과도한 모킹: 모든 것을 모킹하면 실제 시스템의 동작과 괴리가 생길 수 있다.
성능 오버헤드: 대규모 테스트에서는 약간의 성능 저하가 있을 수 있다.
정적 메소드 모킹의 한계: 기본적으로 정적 메소드는 컴파일 시점에 바인딩되므로, 런타임에 동작을 변경하기가 쉽지 않다 → PowerMock 등의 추가 도구 필요
5. 결론
Mockito는 Java 개발자에게 단위 테스트 작성을 크게 간소화해주는 강력한 도구이다. 복잡한 의존성을 가진 코드를 효과적으로 테스트할 수 있게 해주며, 테스트 코드의 가독성과 유지보수성을 높여준다.
하지만 사용할때 주의하면서 사용해야한다. 너무 Mock으로 모든 테스트를 대체할려고 하면 정작 테스트가 필요한 부분을 넘겨버릴 수도 있다.
역시 무엇인지 잘 알고, 어떠한 용도로 사용하고 있는지 인지하면서 프레임워크를 사용해야겠다.
Subscribe to my newsletter
Read articles from HKH directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by