当前位置: 首页 > 知识库问答 >
问题:

如何利用springboot和liquibase建立IntegrationTest内存数据库

孔理
2023-03-14

使用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:在org.springframework.test.context.cache.DefaultCacheawareContextLoaderDelegate.LoadContext加载ApplicationContext失败(DefaultCacheawareContextLoaderDelegate.java:125)

原因:org.springframework.beans.factory.BeanCreationException:创建类路径资源[org/springframework/boot/autociguration/liquiBase/liquiBaseautociguration$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>

在测试类或任何示例项目中,是否有Im缺失的内容,url也很有帮助。我是springboot和liquibase的新手。

共有1个答案

孟韬
2023-03-14

spring boot 2.1.3依赖于Liquibase 3.6.3,但您已经在pom.xml中指定了3.4.2。

说到这里,spring boot的Liquibase autoconfiguration将完成您在单元测试中编写的所有内容,因为您已经创建了激活autoconfiguration的属性。您可以删除测试方法中的所有代码,而只需将一个数据源自动连接到测试类中。spring将为您应用Liquibase更改日志。

最后一件事:如果可以,最好将 添加到pom.xml中,这意味着不需要指定每个依赖项(包括Liquibase)的单独版本。spring boot有很多依赖项,当你升级的时候保持版本的同步是一个很大的工作。这也会阻止您的nosuchmethoderror。

 类似资料:
  • 以下是我的模型:- 我的存储库和服务:- 控制器:- org.springframework.beans.factory.beanCreationException:创建类路径资源[org/springframework/boot/autocconfigure/orm/jpa/hibernatejpaconfiguration.class]中定义的名为“Entity ManagerFactory”

  • 嗨,我正在尝试使用HikariCP与Spring连接池。我正在使用jdbcTempLate和JdbcDaoSupport。 这是数据源的spring配置文件:

  • 参考: Spark独立集群中的工作者、执行者、核心是什么? 火花独立编号执行器/核心控件 如何使用Spark独立集群在辅助节点上管理多个执行器?

  • 有没有人尝试在Spring Boot中创建任何Azure函数,该函数将根据计时器触发,并将使用CosmosDB(Mongo)输入绑定来读取数据库以获取更新。

  • 如果我在changelogs中的某个点从liquibase结果的mysql转储中进行重建,那么重建将会最快,而我之前忽略了changelogs。因此,我将删除changelog master中的所有内容,除了我的master build dump changelog之外,这将是整个数据库,出于版本控制的原因,我保留了实际的changelog。 在LiquiBase中有没有合适的/指定的/安全的方法

  • 我试图为一个编程类设置一个Java DB数据库。我正在遵循Deitel和Deitel教科书中的步骤: 我已经安装了JDK11.8.0_112。我运行的是Windows10。 我的安装在C:\program files\java\jdk1.8.0_112。我将JAVA_HOME var设置为C:\program files\java\jdk1.8.0_112 然后,连接'jdbc:derby:new