////
Search
Duplicate

mockito

Mockito란?

Mockito는 단위 테스트를 위해 모의 객체(Mock Object)를 생성하고 관리하는데 사용되는 Java 오픈소스 프레임워크이다.
이를 사용하면 실제 객체의 동작을 모방하는 모의 객체(Mock Object)를 생성하여 코드의 특정 부분을 격리시키고 테스트하기 쉽게 만들어준다.

Mockito를 이용한 테스트의 목적

모의 객체와 함께 서비스를 호출하여 비즈니스 로직이 올바르게 처리가 되는지 확인하기 위해 테스트를 수행한다.
이러한 테스트 과정을 통해 서비스의 비즈니스 로직에 대해 검증하고 예외 상황에 대한 처리를 확인한다.

Mockito의 주요 기능

Stubbing
특정 메서드가 호출되었을 때 원하는 값을 반환하도록 가짜 객체를 설정한다.
@Test public void testStubbing() { // List 인터페이스의 Mock 객체를 생성한다. List mockList = Mockito.mock(List.class); // mockList.get(0)이 호출되면 "first"를 반환하도록 설정한다. when(mockList.get(0)).thenReturn("first"); // mockList.get(0)의 결과가 "first"인지 검증한다. assertEquals("first", mockList.get(0)); }
Java
복사
Verification
특정 메서드가 원하는 방식으로 호출되었는지 검증한다.
@Test public void testVerification() { // List 인터페이스의 Mock 객체를 생성한다. List mockList = Mockito.mock(List.class); // Mock 객체의 메서드를 호출한다. mockList.add("one"); // mockList.add("one")이 호출되었는지 검증한다. verify(mockList).add("one"); }
Java
복사
Argument Matchers
메서드 호출 시 기대하는 인자의 값을 설정한다.
@Test public void testArgumentMatchers() { // List 인터페이스의 Mock 객체를 생성한다. List mockList = Mockito.mock(List.class); // mockList.get()이 호출되면 "element"를 반환하도록 설정한다. anyInt()는 임의의 정수를 의미. when(mockList.get(anyInt())).thenReturn("element"); // mockList.get(0)과 mockList.get(999)의 결과가 모두 "element"인지 검증한다. assertEquals("element", mockList.get(0)); assertEquals("element", mockList.get(999)); }
Java
복사
Spying
실제 객체를 이용해 일부 메서드만 가짜로 동작하게 설정한다.
@Test public void testSpying() { // 실제 LinkedList 객체를 생성한다. List<String> list = new LinkedList<>(); // LinkedList 객체를 이용해 Spy 객체를 생성한다. List<String> spy = spy(list); // Spy 객체의 메서드를 호출한다. spy.add("one"); spy.add("two"); // spy.add("one")과 spy.add("two")가 호출되었는지 검증한다. verify(spy).add("one"); verify(spy).add("two"); // spy.size()의 결과가 2인지 검증한다. assertEquals(2, spy.size()); // spy.size()가 호출되면 100을 반환하도록 설정한다. when(spy.size()).thenReturn(100); // spy.size()의 결과가 100인지 검증한다. assertEquals(100, spy.size()); }
Java
복사

Mockito 사용 방법

1.
@RunWith(MockitoJUnitRunner.class) 어노테이션을 테스트 클래스에 추가.
2.
Mock 객체 생성 : @Mock 어노테이션을 사용해 가짜 객체를 만든다.
3.
Spy 객체 생성 : @Spy 어노테이션을 사용해 실제 객체를 스파이 객체로 만든다.
4.
의존성 주입 : @InjectMocks 어노테이션을 사용해 Mock 객체나 Spy 객체를 테스트 대상 객체에 주입한다.
5.
Stubbing : 가짜 객체의 동작을 설정한다.
6.
Verification : 메서드 호출을 검증한다.
UserService 클래스와 UserRepository 인터페이스가 있다고 가정.
UserServiceUserRepository를 사용해 사용자의 정보를 가져오는 getUser 메서드와 사용자를 생성하는 createUser 메서드를 가지고 있다.
public class UserService { private UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public User getUser(String id) { return userRepository.findById(id); } public void createUser(User user) { userRepository.save(user); } }
Java
복사
UserService 의 메서드들을 테스트하기 위한 Mockito 사용 예시
@RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @Mock private UserRepository mockRepository; // UserRepository의 Mock 객체 생성 @InjectMocks private UserService userService; // UserService 객체 생성 후, Mock 객체 주입 @Test public void testGetUser() { // 가짜 객체의 findById 메서드가 호출되면 특정 User 객체를 반환하도록 설정 (Stubbing)) User expectedUser = new User("1", "John"); when(mockRepository.findById("1")).thenReturn(expectedUser); // getUser 메서드를 호출하고 반환값을 검증 (Verification) User resultUser = userService.getUser("1"); assertEquals(expectedUser, resultUser); verify(mockRepository).findById("1"); } @Test public void testCreateUser() { User newUser = new User("2", "Jane"); // createUser 메서드를 호출하고 올바르게 동작하였는지 검증 (Verification) userService.createUser(newUser); verify(mockRepository).save(newUser); } }
Java
복사