JwtAuthenticationFilter 추가 후 WebMvcTest 오류
@WebMvcTest에서 IllegalArgumentException 터지는거 해결
참고
오류가 발생하는 코드
Failed to load ApplicationContext 이 오류가 터짐
@WebMvcTest(UserController.class) @AutoConfigureRestDocs @MockBean(JpaMetamodelMappingContext.class) @DisplayName("유저 컨트롤러 테스트") class UserControllerTest { @MockBean private UserService userService; @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper;
해결 방법1
@AutoConfigureMockMvc(addFilters = false) 이 어노테이션을 추가한다.
그래도 오류가 난다.
오류 내용
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jwtAuthenticationFilter' defined in file [/Users/hanju/IdeaProjects/Team-10jo-10wonmoa-BE/build/classes/java/main/com/prgrms/tenwonmoa/domain/user/jwt/JwtAuthenticationFilter.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.prgrms.tenwonmoa.domain.user.jwt.TokenProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at app//org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) at app//org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at app//org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) at app//org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) at app//org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ... 106 more
JwtAuthenticationFilter에서 사용하는 TokenProvider 를 아무래도 못 찾는 것 같다.
해결
목빈으로 테스트 클래스에 넣어준다.
@MockBean의 역할?
@WebMvcTest(UserController.class) @AutoConfigureMockMvc(addFilters = false) @AutoConfigureRestDocs @MockBean(JpaMetamodelMappingContext.class) @DisplayName("유저 컨트롤러 테스트") class UserControllerTest { @MockBean private JwtAuthenticationFilter jwtAuthenticationFilter;
추가로 알아보기
@WebMvcTest는 MVC 관련된 설정들만 적용한다고 한다. (참조)
@Controller
, @ControllerAdvice
, @JsonComponent
, Converter
/GenericConverter
, Filter
, WebMvcConfigurer
,HandlerMethodArgumentResolver beans
but not @Component
, @Service
or @Repository beans
겁나게 많다..
내가 만든 JwtAuthenticationFilter → OncePerRequestFilter → GenericeFilterBean → Filter

Filter여서 찾아온다.
하지만 Filter에서 사용하는 빈들은 찾아오지 못하는 것 같다.
