본문 바로가기
개발/Spring

[Spring Security] @WebMvcTest Error creating bean with name 'securityConfig' defined

by 상용최 2021. 4. 5.
반응형

필자의 사이드프로젝트에 Spring Security가 적용되어 있었다.

Spring Security의 구조를 리팩토링 한 후에 테스트 케이스를 돌려보았는데 @WebMvcTest 가 붙어있는 테스트케이스들이 깨지기 시작하였다. 

SecurityConfig 를 생성하지 못한다는 에러를 뿜었다.

 

이번 리팩토링에서 변화한 것은 필드가 추가되었고 그에따른 생성자가 추가되었다는 것이다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final LoginAuthenticationProvider loginAuthenticationProvider;
    private final JWTAuthenticationProvider jwtAuthenticationProvider;
    private final LoginAuthHandler loginAuthHandler;

    public SecurityConfig(LoginAuthenticationProvider loginAuthenticationProvider, JWTAuthenticationProvider jwtAuthenticationProvider, LoginAuthHandler loginAuthHandler) {
        this.loginAuthenticationProvider = loginAuthenticationProvider;
        this.jwtAuthenticationProvider = jwtAuthenticationProvider;
        this.loginAuthHandler = loginAuthHandler;
    }
}

이것 때문이라고 의심을 하게 되었고 검색을 해보았다.

그러던 중 WebMvcTest 어노테이션은 @Component, @Service, @Repository 을 스캔하지 않는다는 것을 알게되었다.

출처 : docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTest.html

 

WebMvcTest (Spring Boot 2.4.4 API)

Annotation that can be used for a Spring MVC test that focuses only on Spring MVC components. Using this annotation will disable full auto-configuration and instead apply only configuration relevant to MVC tests (i.e. @Controller, @ControllerAdvice, @JsonC

docs.spring.io

 

필자가 추가한 세개의 필드는 Component 어노테이션이 붙어있었기 때문에 스캔을 하지 못해서 빈을 정상적으로 생성하지 못했던 것이다.

해결 방법은 간단하다.

아래와 같이 @MockBean을 추가하면 된다.

public class ControllerTest {
    @MockBean
    LoginAuthenticationProvider loginAuthenticationProvider;

    @MockBean
    JWTAuthenticationProvider jwtAuthenticationProvider;

    @MockBean
    LoginAuthHandler loginAuthHandler;
}
반응형

댓글