Как мои тестовые классы @WebMvcTest могут инициализироваться с помощью этой конфигурации аутентификации JDBC в Spring Boot? - PullRequest
0 голосов
/ 28 октября 2019

Я настроил мое приложение 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, которую я должен добавить к тестовому классу? Я неправильно делаю настройки безопасности?

1 Ответ

0 голосов
/ 29 октября 2019

Решение, которое заставило тесты работать, состояло в том, чтобы добавить это свойство к моему application.yaml:

spring:
  datasource: 
    initialization-mode: always

Или, если вы предпочитаете использовать файл конфигурации application.properties, это будет выглядеть так:

spring.datasource.initialization-mode=always

Я отдаю должное пользователю Japan Trivedi , который указал мне на это в моем связанном вопросе.

...