개발/Spring
@Mock vs @MockBean 테스트 차이
피터JK
2025. 2. 19. 09:56
728x90
@Mock과 @MockBean은 둘 다 Mockito를 이용해 Mock 객체를 생성하는 데 사용되지만, 적용되는 범위와 동작 방식에 차이가 있습니다.
1. @Mock
- Mockito에서 제공하는 애너테이션.
- MockitoAnnotations.openMocks(this);를 호출해야 동작.
- 단순한 유닛 테스트에서 사용.
- Spring Context와 무관하게 동작.
사용 예시
@RunWith(MockitoJUnitRunner.class) // 또는 MockitoAnnotations.openMocks(this) 필요
public class UserServiceTest {
@Mock
private UserRepository userRepository; // Mock 객체
@InjectMocks
private UserService userService; // Mock 객체가 주입될 대상
@Test
public void testFindUser() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User(1L, "Peter")));
User user = userService.findUser(1L);
assertEquals("Peter", user.getName());
}
}
2. @MockBean
- Spring Boot에서 제공하는 애너테이션.
- Spring Application Context 내에서 Mock 객체를 생성 및 등록.
- @SpringBootTest, @WebMvcTest 등 통합 테스트에서 사용됨.
- 기존 Bean을 Mock으로 대체하여 DI를 활용한 테스트 가능.
사용 예시
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserRepository userRepository; // 기존 Bean을 Mock으로 대체
@Autowired
private UserService userService; // Spring의 DI를 통해 주입
@Test
public void testFindUser() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User(1L, "Peter")));
User user = userService.findUser(1L);
assertEquals("Peter", user.getName());
}
}
정리
| 애너테이션 | 제공자 | 동작 범위 | Spring Context 사용 | 주요 활용 |
| @Mock | Mockito | 단위 테스트 | ❌ (Spring과 무관) | 단일 클래스 테스트 |
| @MockBean | Spring Boot | 통합 테스트 | ✅ (Spring Context 내 Bean 대체) | 의존성 주입된 Bean을 Mock으로 대체 |
- 단위 테스트(Unit Test) → @Mock 사용 (Spring Context가 필요 없음)
- Spring 통합 테스트(Integration Test) → @MockBean 사용 (Spring Context 내에서 동작)
사용 환경에 맞게 적절한 애너테이션을 선택하면 됩니다. 😊
728x90