티스토리 뷰
스프링부트에서 테스트 코드를 작성할 때 자주 사용하는 @Mock
과 @MockBean
의 차이점. 이 두 어노테이션은 모킹(Mocking)을 통해 테스트를 효율적으로 작성할 수 있게 해주지만, 용도와 환경이 다르다. 또한, 리포지토리, 서비스 레이어, 컨트롤러 테스트 시 어떤 상황에서 어떤 어노테이션을 사용하는 것이 좋을지 작성.
@Mock
@Mock
은 Mockito 프레임워크에서 제공하는 어노테이션이다. 특정 클래스의 모킹된 객체를 생성하며, 이 객체는 스프링 컨텍스트와는 무관하게 독립적으로 동작한다.
@MockBean
@MockBean
은 스프링 부트에서 제공하는 어노테이션이다. 스프링 애플리케이션 컨텍스트에 모킹된 빈을 추가하고, 실제 스프링 빈 대신 모킹된 빈을 주입한다. 주로 통합 테스트 환경에서 사용된다.
@Mock 사용 예제
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testGetUser() {
User mockUser = new User("John", "Doe");
when(userRepository.findByName("John")).thenReturn(mockUser);
User user = userService.getUser("John");
assertEquals("Doe", user.getLastName());
}
}
@MockBean 사용 예제
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testGetUser() {
User mockUser = new User("John", "Doe");
when(userRepository.findByName("John")).thenReturn(mockUser);
User user = userService.getUser("John");
assertEquals("Doe", user.getLastName());
}
}
차이점
@Mock
:- Mockito 라이브러리에서 제공.
- 독립적인 모킹 객체를 생성.
- 스프링 컨텍스트와 무관.
@MockBean
:- 스프링 부트에서 제공.
- 스프링 애플리케이션 컨텍스트에 모킹된 빈을 등록.
- 통합 테스트 환경에서 사용.
위의 예제를 통해 @Mock
은 독립적으로 동작하고, @MockBean
은 스프링 컨텍스트 내에서 모킹된 빈을 주입하는 차이를 알 수 있다.
리포지토리 테스트
리포지토리 테스트는 주로 데이터베이스와의 상호작용을 검증하는 테스트이다. 이때는 실제 데이터베이스와의 상호작용을 테스트하기 때문에 모킹이 필요하지 않다. 대신, 테스트 전용 데이터베이스를 사용하거나 @DataJpaTest
를 사용한다.
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testFindByName() {
User user = new User("John", "Doe");
userRepository.save(user);
User foundUser = userRepository.findByName("John");
assertEquals("Doe", foundUser.getLastName());
}
}
서비스 레이어 테스트
서비스 레이어 테스트는 비즈니스 로직을 검증하는 테스트이다. 이때는 의존하는 리포지토리나 다른 서비스들을 모킹하여 테스트한다. 여기서는 @Mock
과 @InjectMocks
를 사용해 단위 테스트를 작성한다.
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testGetUser() {
User mockUser = new User("John", "Doe");
when(userRepository.findByName("John")).thenReturn(mockUser);
User user = userService.getUser("John");
assertEquals("Doe", user.getLastName());
}
}
컨트롤러 테스트
컨트롤러 테스트는 주로 HTTP 요청과 응답을 검증하는 테스트이다. 여기서는 실제 서비스 레이어와의 상호작용을 모킹하여 테스트를 진행한다. 이때는 @MockBean
을 사용해 서비스 빈을 모킹하고, @SpringBootTest
또는 @WebMvcTest
를 사용해 통합 테스트를 진행한다.
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
public void testGetUser() throws Exception {
User mockUser = new User("John", "Doe");
when(userService.getUser("John")).thenReturn(mockUser);
mockMvc.perform(get("/users/John"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.lastName").value("Doe"));
}
}
언제 어떤 것을 사용하는 것이 좋은가?
- 리포지토리 테스트: 실제 데이터베이스와의 상호작용을 검증하므로 모킹을 사용하지 않고,
@DataJpaTest
를 사용한다. - 서비스 레이어 테스트: 비즈니스 로직을 검증하며, 의존하는 리포지토리나 다른 서비스를 모킹하기 위해
@Mock
과@InjectMocks
를 사용한다. - 컨트롤러 테스트: HTTP 요청과 응답을 검증하며, 서비스 레이어를 모킹하기 위해
@MockBean
을 사용하고,@WebMvcTest
를 사용한다.
이와 같이, 테스트 대상과 상황에 따라 적절한 모킹 기법과 어노테이션을 선택하여 효율적으로 테스트를 작성할 수 있다.
@Mock과 @MockBean 요약
- @Mock: Mockito 라이브러리에서 제공하며, 독립적인 모킹 객체를 생성한다. 단위 테스트에서 주로 사용된다.
- @MockBean: 스프링 부트에서 제공하며, 스프링 애플리케이션 컨텍스트에 모킹된 빈을 추가한다. 통합 테스트에서 주로 사용된다.
결론
@Mock
은 단위 테스트에서 독립적인 객체 모킹에 적합.@MockBean
은 통합 테스트에서 스프링 컨텍스트에 모킹된 빈을 주입하는 데 적합.
참고
chatGTP4
https://onulmansanda.tistory.com/229
https://cobbybb.tistory.com/16
- Total
- Today
- Yesterday
- 베리 심플
- Bash tab
- LocalDateTime
- springboot
- window
- 북리뷰
- config-location
- k8s
- input
- Kotlin
- intellij
- JavaScript
- svn
- 오라클
- Spring Security
- elasticsearch
- Mac
- Java
- Github Status
- docker
- mybatis config
- oracle
- localtime
- mybatis
- jQuery
- maven
- Linux
- rocky
- Spring
- LocalDate
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |