• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@MockBean, @Mock

23.10.03 02:38 작성 조회수 322

0

@MockBean, @Mock 두 개 사용이 계속 헷갈려서 질문 드립니다.

 

스프링 서버를 띄워서 테스트 할 때 @MockBean을 사용하는 걸로 알려주셨는데

  1. @MockBean도 결국 Mock 객체를 사용하는 거니 @MockBean 대신 @Mock을 써서 테스트를 해도 될 것 같은데 왜 @SpringBootTest나 @WebMvcTest 어노테이션과 @MockBean을 같이 사용해서 테스트 하는 지 궁금합니다.

  2. Controller 테스트를 할 때 @WebMvcTest를 사용하기 위해서 @MockBean을 사용하는 걸까요? @WebMvcTest와 @MockBean이 짝궁(?)이어서 이렇게 사용하는걸까요?

답변 2

·

답변을 작성해보세요.

0

안녕하세요, fbfbf1님! :)

두 질문 모두 비슷한 이야기를 하고 있는 것 같은데요.
@MockBean을 사용하는 이유는, 스프링 컨텍스트 때문입니다.

우리가 스프링을 사용하여 개발하고 서버를 띄우면, 스프링에서 관리하는 Bean과 우리가 코드를 작성하면서 지정한 Bean들이 자동으로 스캔되어 스프링 컨텍스트에 등록됩니다.
Bean이라는 것은 유일하게, 단 하나의 인스턴스만 생성하여 재사용되어야 하기 때문에 (효율성을 위해 그렇게 정했기 때문에) 스프링 컨텍스트에 등록하여 사용하는 것인데요.
@MockBean 이라는 것은 스프링 컨텍스트에 등록한 Bean 대신 내가 만든 Mock 인스턴스로 갈아 끼우겠다는 의미입니다.

반대로 @Mock 은 스프링과 무관하게, 그저 단순한 Mock 객체를 만들어주는 어노테이션이라서 스프링 컨텍스트를 사용하는 테스트에 @Mock 을 사용하더라도, 결국은 스프링 컨텍스트와 무관한 행위이기 때문에 스프링 컨텍스트에는 실제 객체(프로덕션 코드에서 사용되는 Bean)가 Bean으로 남아있게 됩니다.
즉, 스프링 컨텍스트를 사용하는 테스트에서는 Mock 객체가 아니라 프로덕션 Bean 객체를 사용하게 되는 것이죠.

이 차이점을 중심으로 한번 고민해보시면 좋을 것 같습니다. ㅎㅎ

감사합니다. :)

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.05

안녕하세요, 인프런 AI 인턴이에요. @MockBean과 @Mock은 모두 Spring Framework에서 제공하는 Mock 객체를 생성하기 위한 어노테이션입니다. 그러나 두 어노테이션은 사용 용도가 조금 다릅니다.

@MockBean은 스프링 컨텍스트에 Mock 객체를 등록하는 어노테이션으로, 실제로 빈으로 등록되며 스프링에서 관리됩니다. 주로 통합 테스트 시에 사용되며, 테스트 대상이 되는 빈(Bean)에 대한 Mock 객체를 생성합니다. 이 Mock 객체는 스프링이 관리하기 때문에 다양한 스프링 기능을 활용할 수 있습니다. 예를 들어, 의존성 주입(Dependency Injection)이나 AOP(Aspect-Oriented Programming)와 같은 기능을 사용할 수 있어요.

반면에 @Mock은 Mockito 라이브러리에서 제공하는 Mock 객체를 생성하기 위한 어노테이션입니다. Mockito는 단위 테스트 시에 주로 사용되며, 스프링과는 독립적으로 사용됩니다. Mock 객체는 간단히 생성되고 원하는 메서드의 동작을 지정할 수 있어요. 스프링의 컨텍스트와 관계없이 사용할 수 있는 장점이 있어요.

@Controller 테스트를 할 때에는 @WebMvcTest를 사용합니다. @WebMvcTest는 스프링 MVC 계층 테스트를 위한 어노테이션으로, 컨트롤러 클래스만 로드하여 테스트하고 관련된 뷰나 데이터베이스와 같은 다른 빈들은 사용하지 않습니다. 그렇기 때문에 의존성으로 등록된 빈인 경우 Mock 객체로 대체해야 하는데, 여기서 @MockBean을 사용하는 것이죠.

@WebMvcTest는 특정 컨트롤러의 동작을 테스트하고, 관련된 빈들을 Mock 객체로 대체하여 테스트할 수 있도록 해줍니다. 그래서 @WebMvcTest와 @MockBean이 함께 사용되는 것입니다.

간단히 정리하자면, @MockBean은 스프링의 컨텍스트에 Mock 객체를 등록하여 통합 테스트에 사용하고, @Mock은 Mockito 라이브러리를 사용하여 단위 테스트에 사용합니다. @WebMvcTest는 스프링 MVC 계층의 컨트롤러 테스트를 위해 사용되며, @MockBean은 @WebMvcTest와 함께 사용하여 해당 컨트롤러의 Mock 객체를 생성합니다.

더 궁금한 내용이 있으시다면 언제든지 물어보세요!