Тест безопасности Spring с помощью userDetailsService дает незаконное исключениеStateException в тестовом случае - PullRequest
0 голосов
/ 25 мая 2020

У меня есть несколько тестов весенних контроллеров, которые раньше работали нормально. Недавно я добавил аутентификацию с помощью userDetailsService, и теперь, когда я запускаю тесты контроллера, он говорит следующее:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'nl.kars.lms.service.MyUserDetailsService' available: 
expected at least 1 bean which qualifies as autowire candidate.

Я не понимаю почему, потому что все должно быть настроено правильно. Это происходит только при запуске тестов контроллера, приложение работает отлично. Вот мои классы.

Тестовый пример

@RunWith(SpringRunner.class)
@WebMvcTest(ActionController.class)
public class ActionControllerTests {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private ActionService service;

    @Test
    public void testGetActions_returns_result_from_service() throws Exception {
        int actionId = 1;
        Action action = new Action();
        action.setId(actionId);
        List<Action> actionsList = Arrays.asList(action);

        given(service.getActions()).willReturn(actionsList);

        mvc.perform(get("/actions")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(1)))
                .andExpect(jsonPath("$[0].id", Matchers.is(actionId)));
    }
}

Конфигурация

@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    MyUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/**")
                .fullyAuthenticated()
                .and().httpBasic();
    }

    @Bean
    public PasswordEncoder getPasswordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
}

UserDetailsService

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private EmployeeService employeeService;

    @Override
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        return new EmployeeDetails(employeeService.getEmployeeByEmail(email));
    }
}

Мой вопрос: как мне остановить появление ошибки? Что я делаю не так? Я заблудился в этот момент. Спасибо

1 Ответ

1 голос
/ 25 мая 2020

Поскольку вы назвали свой MyUserDetailsService как userDetailsService в @Service("userDetailsService"), у вас есть два варианта:

Первый:
Используйте @Qualifier("userDetailsService") в SecurityConfiguration.

Второй вариант:
Autowire UserDetailsService вместо MyUserDetailsService в SecurityConfiguration.

Предлагаю вам попробовать первый вариант

@Autowired
@Qualifier("userDetailsService")
MyUserDetailsService userDetailsService;

...