Mockito

@Wonyu· March 08, 2025 · 3 min read

✅ Java에서 가장 널리 사용되는 Mocking 프레임워크
✅ 객체의 동작을 사전에 정의하여 단위 테스트를 쉽게 수행할 수 있도록 지원
✅ 실제 객체를 사용하지 않고 Mock 객체를 생성하여 독립적인 테스트를 가능하게 함

📌 사용 방법

JUnit과 함께 사용

✅ Mockito와 JUnit 모두 테스트 프레임워크이기 때문에 같이 사용하기 위해선 설정이 필요하다.

@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationUnitTest {
    ...
}

위와 같이 설정하면, Mockito를 이용해 Mock 객체를 생성하고, JUnit을 통해 테스트할 수 있다.

주요 기능

🔹 Mock 객체 생성

import static org.mockito.Mockito.*;

UserRepository userRepository = mock(UserRepository.class);

🔹 Stub 설정

when(userRepository.findById(1L)).thenReturn(new User(1L, "John Doe", "john@example.com"));

Mockito의 when().thenReturn()을 사용하면, Stub처럼 특정 입력값에 대해 미리 정의된 값을 반환하도록 설정할 수 있다.

🔹 예외 발생 시뮬레이션

when(userRepository.findById(2L)).thenThrow(new UserNotFoundException("User not found"));

Mockito는 예외 상황을 시뮬레이션할 수 있도록 thenThrow()를 제공한다.

🔹 메서드 호출 검증(행위 검증)

verify(userRepository).findById(1L); // 메서드가 호출되었는지 확인
verify(userRepository, times(1)).findById(1L); // 정확히 1번 호출되었는지 확인
verify(userRepository, never()).findById(2L); // 특정 메서드가 호출되지 않았는지 확인

Mockito의 행위 검증 기능을 활용하면, 코드가 예상대로 동작했는지를 명확히 검증할 수 있다.


📌 어노테이션

@Mock

🔹 Mockito.mock() 사용

@Test
public void whenNotUseMockAnnotation_thenCorrect() {
    List mockList = Mockito.mock(ArrayList.class);
    
    mockList.add("one");
    Mockito.verify(mockList).add("one");
    assertEquals(0, mockList.size());

    Mockito.when(mockList.size()).thenReturn(100);
    assertEquals(100, mockList.size());
}

🔹 @Mock 사용

@Mock
List<String> mockedList;

@Test
public void whenUseMockAnnotation_thenMockIsInjected() {
    mockedList.add("one");
    Mockito.verify(mockedList).add("one");
    assertEquals(0, mockedList.size());

    Mockito.when(mockedList.size()).thenReturn(100);
    assertEquals(100, mockedList.size());
}

위처럼 @Mock 어노테이션을 사용하면, static 메서드 없이 mock 객체를 생성할 수 있다.

@InjectMocks

✅ 생성된 Mock 객체를 자동으로 테스트 객체에 주입한다.

🔹 @InjectMocks를 사용하지 않을 때

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    private UserService userService; // @InjectMocks 없이 직접 생성

    @BeforeEach
    void setUp() {
        userService = new UserService(userRepository); // 생성자를 통해 수동으로 주입
    }
}

🔹 @InjectMocks 사용할 때

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @Mock // Mock 객체 생성
    private UserRepository userRepository;

    @InjectMocks // userRepository를 자동으로 주입하여 UserService 생성
    private UserService userService;
}

@InjectMocks는 하나의 SUT에 대해서만 사용해야 한다.


📌 참고

https://www.baeldung.com/mockito-series

@Wonyu
Hello :) I'm Wonyu