테스트 더블 종류 | 설명 |
---|---|
Mock 객체 | 실제 객체를 대체하여 가상의 동작을 정의하는 객체 |
Stub | 고정된 입력에 대해 고정된 출력을 반환하는 간단한 구현 |
Fake | 실제 구현과 유사하게 동작하지만 단순화된 형태의 구현 |
Spy | 실제 객체의 일부 기능을 모방하며, 다른 기능은 실제 객체를 사용하는 객체 |
Dummy | 테스트 중에 사용되지 않는 객체로, 인터페이스를 구현하여 필수 인자로 사용될 때 대체하는 객체 |
@Mock
@Spy
@Spy로 만든 mock 객체는 진짜 객체이며, 메소드 실행 시 스터빙을 하지 않으면 기존 객체의 로직을 실행한 값을, 스터빙을 한 경우엔 스터빙 값을 리턴
public class SpyExampleTest {
@Spy
private List<String> spyList = new ArrayList<>();
@Test
public void testSpyList() {
// 스파이 객체는 실제 객체와 동일하게 동작
spyList.add("A");
spyList.add("B");
assertEquals(2, spyList.size());
assertEquals("A", spyList.get(0));
// 특정 메서드를 Mocking하여 다른 동작을 수행하도록 설정
when(spyList.size()).thenReturn(100);
assertEquals(100, spyList.size()); // 스파이된 메서드는 Mocking된 동작을 수행
assertEquals("A", spyList.get(0)); // 나머지 메서드는 원래 동작을 그대로 수행
}
}
@InjectMocks
문법 | 설명 |
---|---|
when(methodCall).thenReturn(value) | 특정 메서드 호출 시 지정된 값을 반환하도록 설정 |
doReturn(value).when(mock).methodCall() | void 메서드 또는 예외를 던지는 메서드를 스터빙할 때 사용 |
문법 | 설명 |
---|---|
verify(mock).methodCall() | 특정 메서드가 호출되었는지 검증 |
verify(mock, times(n)).methodCall() | 특정 메서드가 n번 호출되었는지 검증 |
verify(mock, never()).methodCall() | 특정 메서드가 호출되지 않았는지 검증 |
Mock 객체 생성
@Mock
private UserRepository userRepository;
Mock 객체 설정
User mockUser = new User("John", "Doe");
// userRepository.findById(1L) 호출 시 mockUser 객체를 반환하도록 설정
when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser)); // 스터빙
테스트 수행
@Test
User user = userService.getUser(1L);
assertNotNull(user);
assertEquals("John", user.getFirstName());
검증
verify(userRepository).findById(1L);
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.mockito.Mock;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import org.junit.Before;
import org.junit.Test;
import java.util.Optional;
public class UserServiceTest {
@Mock
private UserRepository userRepository; // UserRepository의 Mock 객체를 생성
@InjectMocks
private UserService userService; // UserService 객체를 생성하고 @Mock 객체를 주입
@Before
public void setup() {
MockitoAnnotations.openMocks(this); // @Mock 어노테이션이 붙은 객체를 초기화
}
@Test
public void testUserService() {
User mockUser = new User("John", "Doe");
// userRepository.findById(1L) 호출 시 mockUser를 반환하도록 설정
when(userRepository.findById(1L)).thenReturn(mockUser);
// UserService의 getUser 메서드를 호출 및 반환 값 검증
// userService 내부에서 userRepository.findById(1L)이 호출되어 mockUser 객체 반환
User user = userService.getUser(1L);
assertNotNull(user);
assertEquals("John", user.getFirstName());
// userRepository.findById(1L) 메서드가 호출되었는지 검증
verify(userRepository).findById(1L);
}
}