Modckito
- 개발자가 동작을 직접 제어할 수 있는 가짜(Mock) 객체를 지원하는 테스트 프레임워크
- 의존성은 단위 테스트를 작성하는 것을 어렵게 하는데, 이를 해결하기 위해 가짜 객체를 주입시켜줌
- Mockito를 활용함으로써 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행 가능
Mock 객체 의존성 주입
- @Mock: Mock 객체를 만들어 반환해주는 어노테이션
- @Spy: Stub하지 않은 메서드들은 원본 메서드 그대로 사용하는 어노테이션
- @InjectMocks: @Mock 또는 @Spy로 생성된 가짜 객체를 자동으로 주입시켜주는 어노테이션
UserController에 대한 단위 테스트를 작성하고자 할때, UserService를 주입받고 있다면
@Mock 어노테이션을 통해 가짜 UserService를 만들고, @InjectMocks를 통해 UserController에 주입시킬 수 있음 !
Stub
- 의존성이 있는 객체는 가짜 객체(Mock Object)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 함
- Mockito에서는 다음과 같은 stub 메서드를 제공
- doReturn(): Mock 객체가 특정한 값을 반환해야 하는 경우
- doNothing(): Mock 객체가 아무것도 반환하지 않는 경우
- doThrow(): Mock 객체가 예외를 발생시키는 경우
UserService의 findAllUser() 호출 시에 빈 ArrayList를 반환해야 한다면 다음과 같이 doReturn() 을 사용 가능
doReturn(new ArrayList()).when(userService).findAllUser()
Spring API 단위 테스트(Unit Test) 작성
- Mockito와 Junit의 결합 → @ExtendWith(MockitoExtension.class)를사용
@ExtendWith(MockitoExtension.class)
class UserControllerTest {
}
- 의존성 주입
- 테스트 대상인 UserController에는 가짜 객체 주입을 위한 @InjectMocks 붙여줌
- UserService에는 가짜 객체 생성을 위해 @Mock 붙여줌
- 컨트롤러를 테스트하기 위해서는 HTTP 호출이 필요
- 스프링에서는 이를 위한 MockMVC 제공
Controller
@ExtendWith(MockitoExtension.class)
class UserControllerTest {
@InjectMocks
private UserController userController;
@Mock
private UserService userService;
private MockMvc mockMvc;
}
Service
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserRepository userRepository;
@Spy
private BCryptPasswordEncoder passwordEncoder;
}
Repository
@DataJpaTest
- 스프링 부트는 JPA 레포지토리를 손쉽게 테스트할 수 있는 @DataJpaTest 어노테이션을 제공
- 기본적으로 인메모리 데이터베이스인 H2를 기반으로 테스트용 데이터베이스를 구축, 테스트가 끝나면 트랜잭션 롤백
- 레포지토리 계층은 실제 DB와 통신없이 단순 모킹하는 것은 의미가 없으므로 해당 어노테이션 사용
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
}
참고 블로그:
[Spring] JUnit과 Mockito 기반의 Spring 단위 테스트 코드 작성법 (3/3)
이번에는 Spring 기반의 웹 애플리케이션에서 테스트를 작성하는 방법에 대해 알아보도록 하겠습니다. 1. Mockito 소개 및 사용법 [ Mockito란? ] Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜 객
mangkyu.tistory.com
'Spring Boot' 카테고리의 다른 글
Spring Boot Batch (0) | 2024.04.15 |
---|---|
@RequestParam Enum 값 받기 (1) | 2023.11.11 |
단위 테스트(Unit Test)와 통합 테스트 (0) | 2023.08.20 |
API 예외 처리 (0) | 2023.07.12 |
서블릿 필터, 스프링 인터셉터 (0) | 2023.07.10 |