@WebMvcTest에 옵션을 지정해서 특정 컨트롤러 클래스만 빈으로 등록해서 가져오는 기능이 있습니다.
아래의 에러를 만나고 나서야 저는 이 기능을 알게 되었습니다.
Error creating bean with name 'mailAuthController' defined in file
저에게는 두 개의 컨트롤러가 있습니다.
@RestController
@RequestMapping("/api/v1/auth")
@RequiredArgsConstructor
public class MailAuthController {
private final SendMailUseCase sendEmailUseCase;
}
@RestController
@RequiredArgsConstructor
public class PostController {
private final PostUseCase useCase;
}
그리고 PostController의 테스트 코드를 위해서 @WebMvcTest를 사용했습니다.
@WebMvcTest
class PostControllerTest {
@MockBean
PostUseCase useCase;
}
이러면 문제가 발생합니다.
@WebMvcTest에 옵션을 지정하지 않으면 모든 @Controller가 붙은 클래스를 빈으로 등록합니다.
즉, MailAuthController가 빈으로 등록되고 @RequiredArgsConstructor로 SendMailUseCase를 주입해야 합니다.
하지만, 저는 SendMailUseCase를 @MockBean으로 주입하지 않아서 위 에러를 만난 것입니다.
두 가지 해결 방법이 있습니다.
1. SendMailUseCase를 목 빈으로 등록한다.
@WebMvcTest
class PostControllerTest {
@MockBean
PostUseCase useCase;
@MockBean
SendMailUseCase sendMailUseCase;
}
하지만 PostControllerTest에서 SendMailUseCase를 사용하지 않기 때문에 좋은 방법은 아닙니다.
2. @MockMvc에 옵션을 지정한다.
@WebMvcTest(controllers = PostController.class)
class PostControllerTest {
@MockBean
PostUseCase useCase;
}
옵션을 지정하면 해당 클래스의 빈만 등록하므로 다른 빈을 부러오지 않습니다.
저는 이 방법이 제일 좋다고 생각합니다.
'삽질' 카테고리의 다른 글
Spring Web MVC 동작 과정 (0) | 2023.10.21 |
---|---|
findAll과 findById 조회의 차이 (0) | 2023.10.12 |
JIT과 AOT (0) | 2023.09.15 |
Arrays.asList()와 ArrayList가 다른 클래스인 이유 (0) | 2023.07.25 |
main(String[] args)의 의미 (0) | 2023.07.15 |