[SpringBoot] @WebMvcTest 단위 테스트시 Bean 주입 에러

GilLog·2020년 10월 13일
8

에러

목록 보기
3/17

스프링 부트에서 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 등)[갓대희 님]

profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

1개의 댓글

comment-user-thumbnail
2023년 10월 17일

이 에러 때문에 한참을 헤맸는데 덕분에 이유를 알게 됐습니다. 감사합니다 :)

답글 달기