Я настроил мое приложение Spring Boot для использования локальной базы данных для аутентификации, и оно работает (с одним предупреждением, cf мой другой вопрос ), но не все мои тестовые классы хорошо работают с новымконфигурация.
Вот соответствующая часть конфигурации (см. все здесь ):
@Autowired
private DataSource dataSource;
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder .jdbcAuthentication()
.dataSource(dataSource)
.withUser(User.withUsername("admin").password(passwordEncoder().encode("pass")).roles("SUPER"));
logger.debug("Configured app to use JDBC authentication with default database.");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Тестовые классы, украшенные @SpringBootTest
и @AutoConfigureMockMvc
, работают(например, этот ). Насколько я понимаю, они автоматически настраивают различные компоненты приложения и тестируют их вместе (форма интеграционного теста).
У меня проблемы с тестовыми классами, украшенными @WebMvcTest
(например, этот ). Предполагается, что они тестируют только один класс Controller, используя фиктивные объекты для различных Бинов и других зависимостей.
- С момента реализации вышеописанной конфигурации они впервые начали падать с
UnsatisfiedDependencyException
... "Нет доступного квалифицирующего компонента типа 'javax.sql.DataSource'". - Iзатем добавил эти строки в каждый такой тест:
@MockBean
private DataSource dataSource;
- Первое исключение, похоже, прошло, но теперь я получаю следующую ошибку в моих журналах:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection: DataSource returned null from getConnection(): javax.sql.DataSource#0 bean
Эти тесты используют аннотацию @WithMockUser
в нескольких местах и не должны использовать реальную базу данных или соединение JDBC, поскольку каждый из них просто тестирует один контроллер.
Мой вопрос : Как я могу использовать @WebMvcTest с моей текущей конфигурацией безопасности без ошибок тестовых классов? Есть ли удобная аннотация Spring Boot, которую я должен добавить к тестовому классу? Я неправильно делаю настройки безопасности?