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

使用H2数据库和Liquibase配置Spring Boot

归德厚
2023-03-14

我正在使用SpringBoot2,我正在尝试使用H2 Liquibase JUNIT配置一个单元测试。

我认为liquibase没有执行更改日志文件并应用SQL命令,单元测试不识别我的表。

我在文件中放入了错误的sql,以查看是否执行了changelog文件,但似乎没有执行。

为什么我的应用程序不能访问表?也许liquibase没有执行?

在src/test/resource中,我有一个文件:application。yml

spring:
  application:
    name: my-api
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:myDB;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password: sags
  liquibase:
    enabled: true
    user: sa
    password: sags
    change-log: classpath:/db/changelog/db.changelog-master.xml
  jpa:
    hibernate:
      ddl-auto: none
      database-platform: org.hibernate.dialect.H2Dialect
    show-sql: true
    properties:
      hibernate:
        use_sql_comments: true
        format_html" target="_blank">sql: true
  h2:
    console:
      enabled: true
      path: /console

我的测试类:

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class FooRepositoryTest {

    @Autowired
    private FooRepository fooRepository;

    @Test
    public void findAllMustReturnAnything() {
        List<Object> result = fooRepository.tables();
    }
}

foRepository方法:

@Query(value = "SHOW TABLES", nativeQuery = true)
    List<Object> tables();

当我运行单元测试时,我得到以下结果:

我的变更日志文件位于:src/main/resources/db中

更新:我找到了为什么liquibase没有执行我的sql代码。这是因为我的SQL文件有“dbms:mysql”,所以我使用H2 liquibase执行的方式将不适用。

-- changeset 1.0:2 dbms:mysql
command
-- rollback command

现在,我需要知道为什么会话中选择的数据库不是myDB。

共有1个答案

雍俊远
2023-03-14

我认为在你的情况下,Spring打开自动配置数据源。(https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/api/org/springframework/boot/test/autoconfigure/orm/jpa/AutoConfigureTestDatabase.Replace.html)

试着把它关掉。

spring.test.database.replace=none

而且还有一些不必要的配置。

  liquibase:
    user: sa
    password: sags

您可以删除用户

 类似资料:
  • 我正在使用带有Spring Boot(2.3.3版)的H2数据库和H2数据库的所有默认设置。 这是我申请的所有文件。 pom.xml

  • 我正在用Cucumber编写验收测试,我想使用H2数据库进行测试。 应用程序测试属性如下所示: 在目录resources/db/migration中,我有一个包含这些脚本的sql文件: 但是当我运行测试时,H2用默认格式创建模式,而不是使用脚本: 如您所见,所有VARCHAR都是使用255大小创建的,而不是真实值。 你能帮我把飞行道和H2整合起来吗? 谢谢!

  • 我正在使用Glassfish应用服务器开发一个web应用程序。我已经安装了H2 DB,现在正试图在glassfish中定义一个连接池,但在尝试ping DB时失败了。 以下是我所做的: > 资源类型:javax。sql。数据源 数据库驱动程序供应商:H2 数据源类名:org。h2.jdbcx。JdbcDataSource 我的“其他属性”包括: 用户:my\u db\u user 当我尝试ping

  • 如果我在集成测试中使用的是单例数据库容器,那么在每次测试之前,我如何确保数据库处于干净状态(没有数据)?代码库使用Liquibase进行数据迁移。

  • spring控制台加载另一个数据库 如何正确加载H2数据库?

  • 我们有一个现有的数据库在生产。我们已经决定使用liquibase进行所有进一步的更新,并创建任何新的数据库(如开发或集成)。 如果我们在生产上执行liquibase,它将尝试进行所有的完全更改,即使是那些已经存在的更改,这不会发生,因为除了两个新的更新之外,生产中已经有了所有的更改。现在我们想使用liquibase将这两个更改单独更新到产品中。 我们怎么能做到这一点?