개발/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 내에서 동작)

사용 환경에 맞게 적절한 애너테이션을 선택하면 됩니다. 😊

 

2025.02.14 - [개발/자바] - 모킹(Mock) 테스트

728x90