관리 메뉴

ballqs 님의 블로그

[Spring] @Mock , @MockBean 의 차이점 본문

코딩 공부/Spring

[Spring] @Mock , @MockBean 의 차이점

ballqs 2024. 9. 14. 16:50

@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