Pink Spider/@Mock @MockBean 의 차이

Created Thu, 03 Apr 2025 15:57:29 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
979 Words 4 min

@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이 관리해요.

🔸 반면 @MockSpring 컨텍스트 없이도 쓸 수 있어요.

  • 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 대체