Unsatisfied dependency expressed through field 'passwordEncoder': No qualifying bean of type 'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
오늘 테스트 코드를 작성하는 도중 해당 하는 에러를 만났다.
passwordEncoder? 분명 테스트 코드에서 @Autowired로 가져왔는데???🤔
class MemberTest {
@Autowired
private PasswordEncoder passwordEncoder;
...
}
WebSecurityConfig도 만들었는데? Bean을 가져오지 못 하였다.
// src/config/WebSecurityConfig.java
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
...
계속해서 찾아보던 중 2가지를 알게 되었다.
@Import
Spring 테스트 컨텍스트에 필요한 추가 구성을 로드하기 위해 사용 특정 구성 클래스를 가져온다.
@TestConfiguration
Spring 테스트 컨텍스트에 대한 추가 구성을 제공하는 데 사용되는 어노테이션
먼저 test 폴더에 WebSecurityConfig.java를 다시 만들어준다.
// test/config/WebSecurityConfig.java
@TestConfiguration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Import(WebSecurityConfig.class)
class MemberTest {
@Autowired
private PasswordEncoder passwordEncoder;
...
}
DONE