@Mock과 @MockBean은 둘 다 테스트에서 Mock 객체를 만들기 위한 어노테이션이지만, 쓰이는 환경과 역할이 조금 달라요. 간단히 차이부터 요약하면:
🔹 @Mock (from Mockito)
- Mockito에서 제공하는 어노테이션
- **순수 단위 테스트(Unit Test)**에 사용
- Spring Context와는 무관
- 테스트 클래스 내에서 의존성을 Mock으로 주입하고 싶을 때 사용
MockitoAnnotations.openMocks(this)또는@ExtendWith(MockitoExtension.class)와 함께 사용해야 함
예시:
@ExtendWith(MockitoExtension.class)
class MyServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
void testSomething() {
// myRepository는 mock 객체
}
}
🔸 @MockBean (from Spring Boot)
- Spring Boot Test에서 제공하는 어노테이션
- 통합 테스트(Integration Test) 시 사용
- Spring ApplicationContext에 등록된 Bean을 Mock으로 교체
@SpringBootTest,@WebMvcTest,@DataJpaTest같은 Spring 기반 테스트 환경에서 사용
예시:
@SpringBootTest
class MyServiceIntegrationTest {
@MockBean
private MyRepository myRepository;
@Autowired
private MyService myService;
@Test
void testSomething() {
// myRepository는 Spring Context에 있는 실제 Bean을 Mock으로 교체한 것
}
}
✅ 요약 정리표
| 항목 | @Mock |
@MockBean |
|---|---|---|
| 제공 라이브러리 | Mockito | Spring Boot Test |
| 사용 목적 | 단위 테스트용 Mock 객체 생성 | 스프링 컨텍스트 내 Bean을 Mock으로 교체 |
| 사용 환경 | @ExtendWith(MockitoExtension.class) |
@SpringBootTest 등 스프링 테스트 환경 |
| 의존성 주입 | 수동 (@InjectMocks) |
자동 (@Autowired 대상에 주입됨) |
필요에 따라 어떤 테스트를 하고 있는지에 따라 선택하면 돼요! 단위 테스트면 @Mock, Spring과 함께 돌아가는 테스트라면 @MockBean을 쓰면 됩니다.
단위테스트에서는 @MockBean 은 안쓰는가 (당연하지만)
✅ 결론부터 말하면:
단위 테스트(Unit Test) 에서는 일반적으로
@MockBean은 쓰지 않습니다.
대신@Mock+@InjectMocks조합을 씁니다.
❓왜 그럴까?
🔹 @MockBean은 Spring Context에 실제로 Bean을 등록하고, 기존 Bean을 대체합니다.
- 그래서 Spring Boot Test 환경 (
@SpringBootTest,@WebMvcTest, 등)이 필요해요. - 즉, 무겁습니다. 컨텍스트도 띄워야 하고, 주입도 Spring이 관리해요.
🔸 반면 @Mock은 Spring 컨텍스트 없이도 쓸 수 있어요.
- Mockito가 직접 객체를 생성하고, 의존성을 주입해요.
- 그래서 빠르고 가볍고, 진짜 단위 테스트에 적합해요.
📌 예시 비교
✅ 단위 테스트 (@Mock + @InjectMocks)
@ExtendWith(MockitoExtension.class)
class MyServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
void testSomething() {
when(myRepository.findById(1L)).thenReturn(Optional.of(...));
// ...
}
}
❌ 단위 테스트에서 굳이 이렇게 쓰면? (@MockBean)
@SpringBootTest
class MyServiceTest {
@MockBean
private MyRepository myRepository;
@Autowired
private MyService myService;
// 작동은 하지만 Spring Context를 띄워야 해서 무거움
}
👉 이건 통합 테스트에 더 적합한 패턴이에요. 단위 테스트로는 오버스펙.
✅ 정리
| 항목 | @Mock |
@MockBean |
|---|---|---|
| 사용 환경 | 순수 단위 테스트 | Spring 통합 테스트 환경 |
| Spring Context | 필요 없음 | 필요함 (Spring Boot Test 어노테이션 필요) |
| 속도/무게감 | 가볍고 빠름 | 상대적으로 무거움 |
| 사용 목적 | 클래스 내부 의존성 Mock 주입 | Spring Bean 대체 |