inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

@Mock, @Spy, @InjectMocks

@MockBean, @Mock

647

fbfbf1

작성한 질문수 28

1

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

 

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

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

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

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

2

박우빈

안녕하세요, fbfbf1님! :)

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

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

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

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

감사합니다. :)

0

인프런 AI 인턴

안녕하세요, 인프런 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 객체를 생성합니다.

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

private 상수 테스트 관련 질문

0

83

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

126

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

161

2

테스트 문서화 질문입니다

0

105

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

103

2

ERD 가장자리에 있는 도메인 테스트 질문

0

89

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

156

2

계층 관련 질문이 있습니다.

0

139

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

228

2

Service+Repository 통합테스트 관련 질문입니다.

0

150

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

185

2

test 용 .yml

0

90

2

throws Exception

0

80

2

카페키오스크 클래스 문의 ,,

0

89

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

174

2

테스트 코드에서 필요한 생성자

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2