I have a following WebSecurityConfigurerAdapter
implementation:
@Configuration
@Order(0)
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private static final List<String> permittedPaths = asList();
private static final String protectedPath = "";
private final UserDetailsServiceImpl userDetailsService;
private final JwtAuthenticationProvider jwtAuthenticationProvider;
private final DataSource dataSource;
public SecurityConfiguration(
UserDetailsServiceImpl userDetailsService,
JwtAuthenticationProvider jwtAuthenticationProvider,
DataSource dataSource
) {
this.userDetailsService = userDetailsService;
this.jwtAuthenticationProvider = jwtAuthenticationProvider;
this.dataSource = dataSource;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
auth.authenticationProvider(jwtAuthenticationProvider);
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("")
.authoritiesByUsernameQuery("")
.passwordEncoder(passwordEncoder());
}
}
This security works fine for normal running application. But in tests - fails. I have an integration test like:
@WebMvcTest(SomeController.class)
@Import({ErrorHandlerConfiguration.class})
class SomeControllerItTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private RegistrationService registrationService;
@Test
void shouldConfirmRegistration() {}
}
and after run, I get following error:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfiguration' defined in file [SecurityConfiguration.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'UserDetailsServiceImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
When I add to this test SecurityConfiguration
class beans:
@MockBean
private JwtAuthenticationProvider jwtAuthenticationProvider;
@MockBean
private UserDetailsServiceImpl userDetailsService;
@MockBean
private DataSource dataSource;
tests runs normally, without any NoSuchBeanDefinitionException
exceptions.
This solution isn't enough for me. Is there any other way to avoid putting security beans to each integrtation tests?
I tried to use:
@Import({ErrorHandlerConfiguration.class, SecurityConfiguration.class})
@ContextConfiguration(classes = {SecurityConfiguration.class})
without any results.
(removed methods body and some strings for brevity)
// EDIT
Attached missing classes, which are injected into SecurityConfiguration
:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
//method implementation
}
@Component
public class JwtAuthenticationProvider implements AuthenticationProvider {
//method implementation
}