본문 바로가기

삽질

@WebMvcTest 옵션으로 특정 클래스 지정하기

@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