프로젝트에서 테스트 코드를 짜던 중 @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에서 사용하기 위해선 별도로 의존성 주입을 해줘야한다.
해주지 않으면 다음과 같이 객체를 찾을 수 없다는 에러가 발생한다.
해당 어노테이션이 달린 객체에 가짜로 @mock 객체를 의존성 주입할 수 있도록 하는 어노테이션이다.
@mock으로 등록된 객체중 주입되어야할 객체가 있다면 자동으로 의존성 주입해준다.
<의존성 주입>
그 외 테스트 코드에서 사용한 어노테이션에 정리하였다.
Spring Boot에서 컨트롤러의 동작 Unit Test를 지원하는 어노테이션이다.
WebMVCTest 어노테이션으로 설정된 클래스 외에 다른 작업들은 모두 비활성화됨으로써 테스트하려는 작업 단위로만 확인해볼 수 있다.
@Controller, @RestController, @ControllerAdvice, @JsonComponent,
Converter, GenericConverter, Filter, HandlerInterceptor, WebMvcConfigurer, HandlerMethodArgumentResolver
위와 같이 컨트롤러와 관련된 어노테이션 및 클래스에서만 사용된다.
Junit Test를 실행하게 해주는 어노테이션으로 Junit5부터 지원되는 어노테이션이다.
@ExtendWith와 동일하게 사용되는 어노테이션으로 Junit4버전에서 지원된다.
하지만 이전 버전과의 호환으로 @RunWith 주석을 허용하며 SpringExtension.class를 사용하면 된다.
=>SpringBoot에서 컨트롤러를 테스트하는 경우에는 WebMVCTest만 사용해도 된다.
WebMvcTest가 ExtendWith와 RunWith를 포함하고 있고 Unit 별 테스트 기능을 제공하기 때문에 Controller 테스트에는 WebMvcTest 사용하는 것이 적절하다.