ballqs 님의 블로그
[Spring] @Mock , @MockBean 의 차이점 본문
@Mock
- Mockito 라이브러리에서 제공하는 애노테이션입니다.
- Spring 컨텍스트와 무관하게, 단순히 Mock 객체를 생성하고 그 객체를 테스트 내에서 사용할 때 사용됩니다.
- Spring이 아닌 일반 JUnit 테스트에서 Mockito를 사용할 때 주로 사용합니다.
- 주로 @BeforeEach나 @Test 메서드 내부에서 이 Mock 객체에 동작을 설정하거나 검증합니다.
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@Test
public void testFindUser() {
// given
User mockUser = new User("John", "Doe");
when(userRepository.findById(1L)).thenReturn(Optional.of(mockUser));
// when
User foundUser = userService.findUser(1L);
// then
assertEquals("John", foundUser.getFirstName());
}
}
여기서 @Mock은 테스트 클래스 내에서 단순히 Mockito의 Mock 객체로 동작하며, Spring과는 무관합니다.
@MockBean
- Spring Boot Test에서 제공하는 애노테이션입니다.
- Spring 애플리케이션 컨텍스트에 Mock 객체를 등록하고, 해당 컨텍스트 내에서 의존성 주입을 사용할 수 있게 해줍니다.
- **Spring 컨텍스트에 있는 빈(Bean)**을 Mock으로 교체할 때 사용됩니다. 즉, 테스트할 때 실제 Bean 대신 Mock 객체를 주입합니다.
- @WebMvcTest, @SpringBootTest, @DataJpaTest 등 Spring이 관리하는 테스트 환경에서 주로 사용됩니다.
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private UserService userService; // UserService를 Mock으로 교체
@Test
public void testGetUser() throws Exception {
// given
User mockUser = new User("John", "Doe");
when(userService.findUser(1L)).thenReturn(mockUser);
// when & then
mvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.firstName").value("John"));
}
}
여기서 @MockBean은 Spring 컨텍스트에 실제로 등록된 UserService 빈을 Mock으로 교체합니다. MockMvc가 컨트롤러를 테스트할 때, 실제 UserService 빈이 아닌, Mock된 UserService가 사용됩니다.
차이점 요약
특징 | @Mock | @MockBean |
소속 | Mockito 라이브러리 | Spring Boot Test (Spring에서 제공) |
사용 목적 | 단순히 Mock 객체 생성 | Spring 컨텍스트 내의 빈을 Mock으로 교체 |
의존성 주입 | Spring과는 무관, 수동으로 객체 주입 | Spring 컨텍스트에 주입되는 빈을 대체하는 데 사용 |
테스트 환경 | 일반적인 JUnit 테스트 | @WebMvcTest, @SpringBootTest 같은 Spring Boot 테스트 환경 |
컨텍스트 영향 | Spring과 무관 | Spring 컨텍스트에 실제 빈 대신 Mock 객체가 주입됨 |
언제 사용하나?
- **@Mock**은 Spring을 사용하지 않는 순수한 단위 테스트에서 사용하며, Mock 객체로만 테스트하려는 경우 적합합니다.
- **@MockBean**은 Spring 컨텍스트를 사용하면서도 특정 빈을 Mock 객체로 대체해 테스트하고 싶을 때 유용합니다. 특히, @WebMvcTest처럼 컨트롤러 단위 테스트에서 서비스 계층이나 리포지토리 계층을 Mock으로 교체할 때 많이 사용됩니다.
'코딩 공부 > Spring' 카테고리의 다른 글
[Spring] JPA 매핑 기능 (0) | 2024.09.26 |
---|---|
[Spring] @TransactionalEventListener란? (0) | 2024.09.20 |
[Spring] @Configuration 란? (0) | 2024.09.14 |
[Spring] CORS란? (0) | 2024.09.14 |
[Spring] 테스트 코드 심화(Controller , Service) (0) | 2024.09.11 |