#java #postgresql #spring-boot #flyway
#java #postgresql #весенняя загрузка #flyway
Вопрос:
Когда я пытаюсь собрать модуль репозитория, я получаю исключение BeanCreationException для конфигурации Flyway. Пробовал несколько способов, но безуспешно. Может кто-нибудь, пожалуйста, помочь мне в этом?
Ошибка:
Ошибка при запуске ApplicationContext. Чтобы отобразить отчет об автоматической настройке, повторно запустите свое приложение с включенной «отладкой». 2019-03-21 06:11:15.404 ОШИБКА 13480 — [ основная] операционная системазагружается.SpringApplication: сбой запуска приложения org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘flyway’, определенным в com.repository.TestConfig: не удалось создать экземпляр компонента с помощью заводского метода; вложенным исключением является org.springframework.beans.Исключение BeanInstantiationException: не удалось создать экземпляр [org.flywaydb.core.Flyway]: Фабричный метод ‘flyway’ вызвал исключение; вложенным исключением является org.springframework.beans.factory.Исключение BeanCreationException: ошибка при создании компонента с именем ‘DataSource’: не удалось вызвать метод init; вложенным исключением является java.lang.Исключение IllegalStateException: не удалось заменить источник данных встроенной базой данных для тестов. Если вам нужна встроенная база данных, пожалуйста, укажите поддерживаемую базу данных в classpath или настройте атрибут replace в @AutoconfigureTestDatabase.
Класс TestConfig:
@Configuration
@EnableJpaRepositories(basePackages = "com.repository")
@EntityScan(basePackages = {"com.insurance.*"})
@EnableTransactionManagement
@Slf4j
public class TestConfig {
@Bean
public DataSource dataSource() throws IOException {
return embeddedPostgres().getPostgresDatabase();
}
@Bean
public EmbeddedPostgres embeddedPostgres() throws IOException {
return EmbeddedPostgres.start();
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) throws IOException {
return new JdbcTemplate(dataSource);
}
@Bean
public Flyway flyway() throws IOException {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setLocations("db/migration");
flyway.migrate();
return flyway;
}
}
фрагмент pom.xml
<dependency>
<groupId>com.opentable.components</groupId>
<artifactId>otj-pg-embedded</artifactId>
<version>0.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
Тестовый класс:
@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(classes = TestConfig.class)
public class InsuranceRepositoryTest {
---//Test methods
}
Комментарии:
1. Не могли бы вы также показать свой тестовый класс, пожалуйста?
2. Привет, Энди обновил проблему
Ответ №1:
Spring Boot пытается заменить обычную базу данных вашего приложения на ту, которая будет использоваться для тестирования. Однако вы уже сделали это в своей тестовой конфигурации, которая использует встроенный Postgres. Вам нужно использовать @AutoConfigureTestDatabase
, чтобы указать Spring Boot не заменять вашу базу данных:
@AutoConfigureTestDatabase( replace = Replace.NONE