[Java Project] 테스트 코드에서 @MockBean @Mock

Erin Lee·2024년 3월 13일
0

Project

목록 보기
2/5
post-thumbnail

@MockBean과 @Mock


프로젝트에서 테스트 코드를 짜던 중 @MockBean 어노테이션을 사용하게 되었는데 @Mock이란 어노테이션도 비슷한 역할을 해보인다.
어떻게 사용될까?

@WebMvcTest(controllers = AdminMeetingController.class)
public class AdminMeetingControllerTest {
f-lab-robert marked this conversation as resolved.

    @Autowired
    MockMvc mockMvc;
    @MockBean
    AdminMeetingService adminMeetingService;
    @Autowired
    ObjectMapper objectMapper;

@MockBean과 @Mock의 가장 큰 차이점은 Spring Bean 생성과 의존성 유무이다.

@MockBean으로 등록시 자동으로 Spring Bean으로 생성해주며 설정된 의존성 주입을 해준다.
하지만 @mock 으로 등록한다면 Spring Bean이 아닌 그냥 객체를 생성하는 것이기 때문에 Spring Boot에서 사용하기 위해선 별도로 의존성 주입을 해줘야한다.

해주지 않으면 다음과 같이 객체를 찾을 수 없다는 에러가 발생한다.

@Injectmocks

해당 어노테이션이 달린 객체에 가짜로 @mock 객체를 의존성 주입할 수 있도록 하는 어노테이션이다.
@mock으로 등록된 객체중 주입되어야할 객체가 있다면 자동으로 의존성 주입해준다.

<의존성 주입>

  • 생성자 기반 주입
  • Setter 메서드 주입
  • 필드 주입


그 외 테스트 코드에서 사용한 어노테이션에 정리하였다.

@WebMvcTest


Spring Boot에서 컨트롤러의 동작 Unit Test를 지원하는 어노테이션이다.

WebMVCTest 어노테이션으로 설정된 클래스 외에 다른 작업들은 모두 비활성화됨으로써 테스트하려는 작업 단위로만 확인해볼 수 있다.

@Controller, @RestController, @ControllerAdvice, @JsonComponent,
Converter, GenericConverter, Filter, HandlerInterceptor, WebMvcConfigurer, HandlerMethodArgumentResolver

위와 같이 컨트롤러와 관련된 어노테이션 및 클래스에서만 사용된다.


@ExtendWith와 @RunWith


@ExtendWith (MockitoExtension.class)

Junit Test를 실행하게 해주는 어노테이션으로 Junit5부터 지원되는 어노테이션이다.

@RunWith(MockitoJUnitRunner.class)

@ExtendWith와 동일하게 사용되는 어노테이션으로 Junit4버전에서 지원된다.

하지만 이전 버전과의 호환으로 @RunWith 주석을 허용하며 SpringExtension.class를 사용하면 된다.


결론

=>SpringBoot에서 컨트롤러를 테스트하는 경우에는 WebMVCTest만 사용해도 된다.
WebMvcTest가 ExtendWith와 RunWith를 포함하고 있고 Unit 별 테스트 기능을 제공하기 때문에 Controller 테스트에는 WebMvcTest 사용하는 것이 적절하다.

profile
내가 설명할 수 있어야 비로소 내가 아는 것이다

0개의 댓글