Mockito 가 뭔데?

HKHHKH
2 min read

Java 프로젝트의 테스트 코드를 작성할 때 사용할 수 있는 다양한 테스트 방식들이 있다.

@SpringBootTest, @SpringMvcTest, @DataJpaTest 등등

그 중에서 많이 사용되고 있는 Mockito 관련 내용을 정리를 해 보자

1. Mockito란?

Mockito는 Java 애플리케이션을 위한 오픈소스 모킹 프레임워크이다.

Mock 이라는 말은 흉내낸다는 말을 담고 있다.

Mock이라는 객체를 만들어서 어떤 객체의 동작을 수행하는 것처럼 흉내내는 것을 의미한다.

단위 테스트를 작성할 때 객체의 동작을 시뮬레이션하고 검증하는 데 사용된다.

Mockito를 사용하면 복잡한 의존성을 가진 코드도 쉽게 테스트할 수 있으며, 테스트 더블(Test Double)을 만들어 실제 객체를 대체할 수 있다.


2. Mockito의 장점 및 사용 시기

장점:

  1. 간단한 API: Mockito는 직관적이고 사용하기 쉬운 API를 제공한다.

  2. 높은 유연성: 다양한 시나리오에 대한 모의 객체를 쉽게 생성하고 구성할 수 있다.

  3. 가독성: Mockito를 사용한 테스트 코드는 읽기 쉽고 이해하기 쉽다.

  4. 통합의 용이성: JUnit과 같은 다른 테스팅 프레임워크와 쉽게 통합된다.

  5. 강력한 검증 기능: 메소드 호출, 인자, 호출 순서 등을 세밀하게 검증할 수 있다.

그러면 언제 사용할까?

  1. 외부 의존성이 있는 경우: 데이터베이스, 웹 서비스 등 외부 시스템에 의존하는 코드를 테스트할 때

  2. 복잡한 객체 그래프: 복잡한 객체 관계를 가진 코드를 테스트할 때

  3. 특정 상황 시뮬레이션: 예외 상황이나 특정 시나리오를 테스트해야 할 때

  4. 레거시 코드 테스트: 기존 코드를 수정하지 않고 테스트를 추가해야 할 때


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도 만능은 아니다

  1. 런타임 동작에 의존: Mockito는 런타임에 동작하므로, 컴파일 시점에 발견되지 않는 오류가 있을 수 있다.

  2. 과도한 모킹: 모든 것을 모킹하면 실제 시스템의 동작과 괴리가 생길 수 있다.

  3. 성능 오버헤드: 대규모 테스트에서는 약간의 성능 저하가 있을 수 있다.

  4. 정적 메소드 모킹의 한계: 기본적으로 정적 메소드는 컴파일 시점에 바인딩되므로, 런타임에 동작을 변경하기가 쉽지 않다 → PowerMock 등의 추가 도구 필요


5. 결론

Mockito는 Java 개발자에게 단위 테스트 작성을 크게 간소화해주는 강력한 도구이다. 복잡한 의존성을 가진 코드를 효과적으로 테스트할 수 있게 해주며, 테스트 코드의 가독성과 유지보수성을 높여준다.

하지만 사용할때 주의하면서 사용해야한다. 너무 Mock으로 모든 테스트를 대체할려고 하면 정작 테스트가 필요한 부분을 넘겨버릴 수도 있다.

역시 무엇인지 잘 알고, 어떠한 용도로 사용하고 있는지 인지하면서 프레임워크를 사용해야겠다.

1
Subscribe to my newsletter

Read articles from HKH directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

HKH
HKH