스프링 부트에서 JUnit @WebMvcTest로 컨트롤러 테스트를 하고 있었는데, 아래와 같은 에러가 발생했다.
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userRoleService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.noryangjin.boostcourse.service.UserRoleService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
확인해 본 결과 해당 컨트롤러를 생성하는데 필요한 빈을 정의 할 수 없다는 문제 였다.
@WebMvcTest는 웹과 관련된 빈만 주입되고(@Controller, @ControllerAdvice 등)
@Service같은 @Component는 주입되지 않는다고 한다.
@Service 빈이 주입되지 않아, 컨트롤러 생성에 실패하여 발생한 에러였다.
확인해보니 UserController 에서는 userRoleService가 주입 되어 있는데,
@Test에서는 userService만 @MockBean으로 가짜 객체를 주입시켜주고, userRoleService는 의존성 주입을 해주지 않아 발생한 오류 였다.
결국 TestController에 @MockBean
을 통해 userRoleService
를 주입시켜주니 해결됐다!
이렇게 @WebMvcTest를 사용하여 Controller를 Test할때는 아래 내용들만 스캔하도록 제한 된다고 한다.
@Controller, @ControllerAdvice, @JsonComponent,
Converter, GenericConverter, Filter, HandlerInterceptor,
WebMvcConfigurer, HandlerMethodArgumentResolver
[spring] 스프링 부트에서 @WebMvcTest 사용하며 RestTemplate 주입받기[깜비 님]
[스프링부트 (10)] SpringBoot Test(3) - 단위 테스트(@WebMvcTest, @DataJpaTest, @RestClientTest 등)[갓대희 님]
이 에러 때문에 한참을 헤맸는데 덕분에 이유를 알게 됐습니다. 감사합니다 :)