Spring Boot 2.2 이상의 버전 프로젝트 생성 시, 기본적으로 Spring-boot-starter-test에서 자동으로 Mockito를 추가해 준다.
Spring Boot를 사용하지 않을 때, 의존성을 직접 추가하는 방법
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
Mockito core : Mockito가 제공하는 기본적인 기능
Mockito-junit-jupiter : junit 테스트에서 Mockito를 연동해서 사용할 수 있도록 하는 확장팩이다
Mock을 활용하여 테스트 작성시 알아야 하는 3가지 (아래 내용에서 계속....)
Mockito.mock() 메소드로 만드는 방법
@Test
@DisplayName("Mock 객체 만들기 - Mockito.mock() 메소드로 만들기")
void makeMockInstanceByMockitoMethod(){
MemberService memberService = Mockito.mock(MemberService.class);
StudyRepository studyRepository = Mockito.mock(StudyRepository.class);
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
@Mock 어노테이션으로 만드는 방법
JUnit5 extention으로 MockitoExtension 사용
필드에 정의하기
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Mock
MemberService memberService;
@Mock
StudyRepository studyRepository;
@Test
@DisplayName("Mock 객체 만들기 - @Mock 사용(필드)")
void makeMockInstanceByMockAnnoVersionField(){
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
메소드 메개변수로 정의하기
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Test
@DisplayName("Mock 객체 만들기 - @Mock 사용(메소드 매개변수)")
void makeMockInstanceByMockAnnoVersionParameter(@Mock MemberService memberService,
@Mock StudyRepository studyRepository){
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
Stubbing 이란?
Mock 객체를 조작해서 할 수 있는 일
특정한 매개변수를 받은 경우 특정한 값을 리턴하거나 예외를 던지도록 하기
특정한 값 리턴
@Test
@DisplayName("UserService 유저 정보 가져오기 - 성공 시")
void getUserInfoById() {
//Given
User user = new User("test1234", "1234", "admin", "test@gmail.com");
Mockito.when(userRepository.getUserInfoById(1L)).thenReturn(Optional.of(user));
//When
Optional<User> userInfo = userRepository.getUserInfoById(1L);
UserInfoResponseDTO userInfoResponseDTO = userInfo.get().toUserInfoResponseDTO();
//Then
assertEquals("test1234", userInfoResponseDTO.getAccount());
assertEquals("admin", userInfoResponseDTO.getName());
assertEquals("test@gmail.com", userInfoResponseDTO.getEmail());
}
예외 상황 발생
@Test
@DisplayName("UserService 유저 정보 가져오기 - RuntimeException 발생시키기")
void getUserInfoException() {
//Given
Mockito.when(userRepository.getUserInfoById(2L)).thenThrow(new RuntimeException());
//When
//Then
assertThrows(RuntimeException.class, () -> {
userRepository.getUserInfoById(2L);
});
}
void 메소드 특정 매개변수를 받거나 호출된 경우 예외 발생하기
메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동하도록 조작하기
텍스트