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 인터페이스가 있다고 가정.
•
UserService는 UserRepository를 사용해 사용자의 정보를 가져오는 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
복사