我正在构建一个由Postgres支持的Spring Boot应用程序,使用Flyway进行数据库migrations.我遇到了一些问题,无法在Postgres和嵌入式单元测试数据库(即使启用了Postgres兼容模式)中生成所需结果的migrations.所以我正在考虑使用嵌入式Postgres进行单元测试.

我遇到了an embedded postgres个看起来很有希望的实现,但实际上不知道如何将其设置为仅在Spring Boot的单元测试框架中运行(用于测试Spring数据存储库).如何使用上述工具或Postgres的替代嵌入式版本进行设置?

推荐答案

我是@MartinVolejnik提到的embedded-database-spring-test库的作者.我认为这个库应该满足你的所有需求(PostgreSQL+Spring Boot+Flyway+集成测试).我真的很抱歉您遇到了一些麻烦,所以我创建了一个simple demo app,演示了该库与Spring Boot框架的使用.下面我总结了一些你需要做的基本步骤.

Maven configuration

添加以下maven依赖项:

<dependency>
    <groupId>io.zonky.test</groupId>
    <artifactId>embedded-database-spring-test</artifactId>
    <version>2.0.1</version>
    <scope>test</scope>
</dependency>

Flyway configuration

将以下属性添加到应用程序配置中:

# Sets the schemas managed by Flyway -> change the xxx value to the name of your schema
# flyway.schemas=xxx // for spring boot 1.x.x
spring.flyway.schemas=xxx // for spring boot 2.x.x

此外,确保不要使用org.flywaydb.test.junit.FlywayTestExecutionListener.因为库有自己的测试执行监听器,可以优化数据库初始化,如果应用FlywayTestExecutionListener,这种优化没有效果.

Example

演示嵌入式数据库使用的测试类示例:

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureEmbeddedDatabase
public class SpringDataJpaAnnotationTest {

    @Autowired
    private PersonRepository personRepository;

    @Test
    public void testEmbeddedDatabase() {
        Optional<Person> personOptional = personRepository.findById(1L);

        assertThat(personOptional).hasValueSatisfying(person -> {
            assertThat(person.getId()).isNotNull();
            assertThat(person.getFirstName()).isEqualTo("Dave");
            assertThat(person.getLastName()).isEqualTo("Syer");
        });
    }
}

Postgresql相关问答推荐

使用RANGE窗口框架条款将SUM分析函数从PostgreSQL移至Redwitch

PostgreSQL中btree_gist索引涉及integer和tstzrange属性查询计划的问题

带有regex表达式的Postgres SQL

无法在PostgreSQL中创建方案和表

无法使用PGx连接到Postgres数据库AWS RDS

JOOQ:数据库版本早于 COCKROACHDB 支持的方言:13.0.0

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

无法从在 wsl 2 上运行的服务之一连接到在 wsl 2 上的容器中运行的 postgres 数据库

如何使用 SQLAlchemy 将列默认设置为 PostgreSQL 函数?

转换数组类型

Django 1.8 数组字段追加和扩展

在 to_tsquery 中转义特殊字符

在 postgreSQL 中更改序列名称

使用 current_setting() 判断值

Redis 可以写出到像 PostgreSQL 这样的数据库吗?

子查询的自连接

PostgreSQL 9 在 Windows 上安装:Unable to write inside TEMP environment path.

与 iexact 一起使用时,Django get_or_create 无法设置字段

PostgreSQL - 作为表名的动态值

如何查询前 10 行,下一次从表中查询其他 10 行