【问题标题】:how to set-up in memory database for IntegrationTest using springboot and liquibase如何使用 spring boot 和 liquibase 在内存数据库中设置集成测试
【发布时间】:2019-07-17 21:40:17
【问题描述】:

使用 liquibase 和 springboot,创建​​了数据库更改日志,并能够使用 maven-liquibase-plugin (mvn liquibase:update) 成功运行它。我正在编写集成测试,其中需要以编程方式创建 liquibase 更改。

@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.BeanCreationException: 在类路径资源 [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class] 中定义名称为“liquibase”的 bean 创建错误: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException: 无法实例化 [liquibase.integration.spring.SpringLiquibase]: 工厂方法“liquibase”抛出异常;嵌套异常是 java.lang.NoSuchMethodError: liquibase.integration.spring.SpringLiquibase.setLiquibaseSchema(Ljava/lang/String;)V

原因:java.lang.NoSuchMethodError: liquibase.integration.spring.SpringLiquibase.setLiquibaseSchema(Ljava/lang/String;)

下面是application-test.property文件。

  #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 的新手。

【问题讨论】:

    标签: java spring spring-boot liquibase


    【解决方案1】:

    Spring Boot 2.1.3 依赖于 Liquibase 3.6.3,但您在 pom.xml 中指定了 3.4.2。

    话虽如此,Spring Boot 的 Liquibase 自动配置将完成您在单元测试中自己编写的所有内容,因为您已经创建了属性来激活自动配置。您可以删除测试方法中的所有代码,而只需将 @Autowire 一个 DataSource 放入测试类。 Spring 将为您应用 Liquibase 更改日志。

    最后一件事:如果可以的话,最好将&lt;parent&gt; 添加到您的 pom.xml 中,这意味着您不需要指定每个依赖项的单独版本(包括 Liquibase)。 Spring Boot 有很多依赖项,并且在升级时保持版本同步需要做很多工作。这也可以防止您的 NoSuchMethodError。

    【讨论】:

      猜你喜欢
      • 2016-06-30
      • 2019-11-27
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2013-11-05
      • 2018-02-19
      • 2020-03-09
      • 2019-01-26
      相关资源
      最近更新 更多