Mockito - Mock,Stub,Spy

심민혁·2025년 5월 18일

weeklypaper

목록 보기
14/18
post-thumbnail

테스트에서 사용되는 Mockito의 Mock, Stub, Spy 개념을 각각 설명하고, 어떤 상황에서 어떤 방식을 선택해야 하는지 구체적인 예시와 함께 설명하세요.

Mock

  • 개념 : 메서드 호출 여부 및 특정 행위를 확인하기 위해 사용하는 가짜 객체
  • 특징 :
    - 실제 로직을 사용하지 않음
    • 모든 메서드가 기본적으로 빈 값이나 null을 반환

Stub

  • 개념 : 특정 메서드 호출 시 미리 정해둔 응답값을 반환하는 형태의 객체
  • 특징 :
    - 메서드 호출 시 원하는 값을 반환하도록 정의
    • 특정 메서드 호출에만 초점을 맞춤

Spy

  • 개념 : 실제 객체를 기반으로 생성하며, 특정 메서드만 행위를 재정의하거나 관찰 가능
  • 특징 :
    - 기본적으로 실제 로직 실행
    • 필요한 메서드만 Stub으로 재정의 가능

1. 각 방식의 구체적인 활용 사례

Mock

  • 메서드 호출 여부, 호출 횟수, 파라미터 검증에 주로 사용
  • 실제 구현체를 호출하지 않고 호출 자체만 확인할 때 적합

예시) 사용자 생성 서비스에서 Repository 호출 여부 검증

@Test
void createUser_verifyRepositoryInteraction() {
    UserRepository mockRepository = Mockito.mock(UserRepository.class);
    UserService userService = new UserService(mockRepository);
    User user = new User("test");

    userService.create(user);

    Mockito.verify(mockRepository).save(user);
}

Stub

  • 특정 메서드 호출 시 특정 값을 반환하게 만들어 테스트가 독립적으로 동작하도록 지원
  • 반환 값을 정의하여, 테스트의 특정 조건을 시뮬레이션할 때 유용

예시) 사용자 조회 시 특정 ID로 고정된 User 객체 반환

@Test
void findUser_stubSpecificResponse() {
    UserRepository stubRepository = Mockito.mock(UserRepository.class);
    UserService userService = new UserService(stubRepository);
    
    Mockito.when(stubRepository.findById(1L))
           .thenReturn(Optional.of(new User("stubUser")));

    User user = userService.findById(1L);

    assertEquals("stubUser", user.getName());
}

Spy

  • 실제 객체의 로직을 유지하면서 특정 메서드의 행위만 변경하거나 검증할 때 사용
  • 기존 로직을 최대한 활용하면서 일부분만 변경하거나, 특정 메서드의 호출을 관찰할 때 적합

예시) 실제 ArrayList를 기반으로 특정 메서드의 반환값을 변경하는 경우

@Test
void spyList_partialMocking() {
    List<String> spyList = Mockito.spy(new ArrayList<>());
    
    spyList.add("A");
    spyList.add("B");

    assertEquals(2, spyList.size());

    Mockito.when(spyList.size()).thenReturn(100);

    assertEquals(100, spyList.size());

    assertEquals("A", spyList.get(0));
}

2. 상황별 Mockito 사용 시기

상황적합한 방식이유 및 설명
단순 메서드 호출 검증Mock특정 메서드의 호출 여부나 파라미터를 검증하기 쉬움
미리 정해진 조건의 응답 반환Stub특정 조건을 가정하고 원하는 반환값을 제공
일부 메서드만 행위 변경, 나머지는 실제 로직 실행Spy실제 객체를 기반으로 최소한의 메서드만 변경할 수 있어 테스트가 더 현실적
profile
열심히 하고 싶습니다

0개의 댓글