✅ 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에 대해서만 사용해야 한다.