Тестирование контроллера пружины с включенной защитой пружины не может загрузить контекст приложения - PullRequest
0 голосов
/ 13 апреля 2020

Я добавил пружинную защиту в мое приложение, и теперь мои тестовые модули перестали работать, не удается загрузить контекст приложения. Безопасность, которую я добавил, генерирует токен jwt, который должен быть предоставлен для доступа к моим конечным точкам API. Кажется, ошибка в том, что он не может найти подходящий компонент для UserDetailsService. Любая помощь будет оценена. Моя установка выглядит следующим образом: JwtUserDetailsService:

@Service
public class JwtUserDetailsService implements UserDetailsService {

@Autowired
private UserRepositoryJWT userRepository;

@Autowired
private PasswordEncoder bcryptEncoder;


@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    UserEntityJWT user = userRepository.findByUsername(username);
    if (user == null) {
        throw new UsernameNotFoundException("User not found with username: " + username);
    }
    return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(),
            new ArrayList<>());
}
}

Конфигурация безопасности:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecuirtyConfig extends WebSecurityConfigurerAdapter {

@Autowired
private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;

@Autowired
private UserDetailsService jwtUserDetailsService;

@Autowired
private JwtRequestFilter jwtRequestFilter;

@Autowired
@Bean
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(jwtUserDetailsService).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.cors().and()
            .csrf().disable()
            .authorizeRequests().antMatchers("/authenticate", "/register").permitAll().
                    anyRequest().authenticated().and().                        exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}
}

Мой модульный тест для контроллера, для которого пользователь должен пройти проверку подлинности, является:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers =  ReportingController.class)
public class ReportingController_UT {

@Autowired
private MockMvc mvc;

@MockBean
private ReportingService reportingService;

@Test
public void getDailyTestInfo_WithBuildingIDInURL_ShouldCallgetDailyReportInfoMethod() throws Exception {
    when(reportingService.getDailyReportInfo(anyInt())).thenReturn(anyList());

    mvc.perform(get(GET_DAILY_REPORTS_URL).characterEncoding(UTF_8)
            .contentType(MediaType.APPLICATION_JSON));

    verify(reportingService,times(1)).getDailyReportInfo(anyInt());
}

При выполнении теста выдается следующее исключение:

 java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:95)
at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:79)
at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.api.jwt.JwtUserDetailsService' 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.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636)
...