как настроить базу данных памяти для IntegrationTest с использованием Springboot и liquibase - PullRequest
0 голосов
/ 24 февраля 2019

Используя liquibase и springboot, создал дабл-логи и смог успешно запустить его с помощью maven-liquibase-plugin (mvn liquibase: update).Я пишу интеграционные тесты, в которых изменения в жидкой базе необходимо создавать программно.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DummyApplication.class)
@ActiveProfiles("test")
public class TestDummyService
{
    @Autowired
    private SpringLiquibase springLiquibase;
    ...

    @Test
    public void testDummyRequest()
    {
    try {
        Connection connection = springLiquibase.getDataSource().getConnection();
        Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
        Liquibase liquibase = new liquibase.Liquibase("liquibase/changelog/db-changelog-master.xml", new ClassLoaderResourceAccessor(), database);
        liquibase.update(new Contexts(springLiquibase.getContexts()), new LabelExpression(springLiquibase.getLabels()));
    } catch (LiquibaseException | SQLException e) {
        e.printStackTrace();
    }
}

Получение приведенного ниже исключения при выполнении вышеуказанного теста.

java.lang.IllegalStateException: Не удалось загрузить ApplicationContext в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:125)

Вызвано: org.springframework.beans.factory.BeanCreaseException Ошибка с определенным именем класса в недопустимом классе[org / springframework / boot / autoconfigure / liquibase / LiquibaseAutoConfiguration $ LiquibaseConfiguration.class]: не удалось создать экземпляр компонента с помощью метода фабрики;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [liquibase.integration.spring.SpringLiquibase]: фабричный метод 'liquibase' вызвал исключение;Вложенное исключение - java.lang.NoSuchMethodError: liquibase.integration.spring.SpringLiquibase.setLiquibaseSchema (Ljava / lang / String;) V

Вызывается:setLiquibaseSchema (Ljava / lang / String;)

ниже - application-test.property file.

  #NOTE : spring.liquibase is the working one .

  liquibase.changeLog=classpath:liquibase/changelog/db-changelog-master.xml
  liquibase.enabled=true
  liquibase.url=jdbc:h2:mem:cpass;DB_CLOSE_DELAY=-1
  liquibase.user=root
  liquibase.password=
  spring.liquibase.dropFirst=true
  hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
  jdbc.driverClassName=org.h2.Driver
  spring.liquibase.enabled=true
  spring.liquibase.change-log=classpath:liquibase/changelog/db-changelog-master.xml
  #spring.liquibase.driver=com.mysql.jdbc.Driver
  spring.liquibase.url=jdbc:mysql://localhost:3306/dummy
  spring.liquibase.user=root
  spring.liquibase.password=

** pom.xml: **

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.3.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.1.3.RELEASE</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.15</version>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>3.4.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.1.3.RELEASE</version>
        </plugin>

        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.4.2</version>
            <configuration>
                <propertyFile>liquibase/liquibase.properties</propertyFile>
                <changeLogFile>liquibase/changelog/db-changelog-master.xml</changeLogFile>
            </configuration>
        </plugin>
    </plugins>
</build>

Есть ли что-то, что я пропускаю в тестовом классе, или любой примерный URL проекта также очень полезен.Я новичок в Springboot и liquibase.

1 Ответ

0 голосов
/ 24 февраля 2019

Spring Boot 2.1.3 зависит от Liquibase 3.6.3, но вы указали 3.4.2 в своем pom.xml.

Сказав это, автоконфигурация Spring Boot Liquibase сделает все, что вы написали самостоятельнов вашем модульном тесте, потому что вы уже создали свойства для активации автоконфигурации.Вы можете удалить весь код в тестовом методе и просто @Autowire DataSource в тестовый класс.Spring будет применять для вас список изменений Liquibase.

И последнее: если вы можете, было бы лучше добавить <parent> в ваш файл pom.xml, что означает, что вам не нужно указывать отдельные версии.каждой зависимости (в том числе Liquibase).Spring Boot имеет много зависимостей и много работы по поддержанию синхронизации версий при обновлении.Это также предотвратило бы вашу ошибку NoSuchMethodError.

...