我正在构建一个Sping Boot 应用程序,由Postgres支持,使用Flyway进行数据库迁移。我一直遇到这样的问题,即我无法在Postgres和嵌入式单元测试数据库中生成所需的结果(即使启用了Postgres兼容模式)。所以我正在考虑使用嵌入式Postgres进行单元测试。
我遇到了an embedded postgres实现,它看起来很有前途,但不知道如何将其设置为仅在Sping Boot 的单元测试框架中运行(用于测试Spring Data存储库)。如何使用上述工具或Postgres的替代嵌入式版本来设置它?
5条答案
按热度按时间62o28rlo1#
我是@MartinVolejnik提到的embedded-database-spring-test库的作者。我认为这个库应该能满足您的所有需求(PostgreSQL + Sping Boot + Flyway +集成测试)。我真的很抱歉你遇到了一些麻烦,所以我创建了一个simple demo app,演示了如何将库与Sping Boot 框架一起使用。下面我总结了一些你需要做的基本步骤。
Maven配置
添加以下maven依赖项:
航路配置
将以下属性添加到应用程序配置中:
此外,请确保您没有使用
org.flywaydb.test.junit.FlywayTestExecutionListener
。因为库有自己的测试执行侦听器,可以优化数据库初始化,如果应用FlywayTestExecutionListener
,则此优化无效。示例
演示嵌入式数据库使用的测试类示例:
o2rvlv0m2#
解决这个问题的另一个相当干净的方法是使用
TestContainers
库。唯一需要注意的是,它需要Docker。集成测试:
依赖配置:
pom.xml
:build.gradle
:链接:
TestContainers - Databases
TestContainers - Postgres Module
mpgws1up3#
下面的配置与Sping Boot 2.0配合良好。
与embedded-database-spring-test相比,这个解决方案的优点是不会将Flyway推入类路径,这可能会扰乱Sping Boot 的自动配置。
玛文:
这个类基于我在这里找到的代码:https://github.com/nkoder/postgresql-embedded-example
我修改了它,使用
HikariDatasource
(Sping Boot 的默认值)进行正确的连接池。binariesDir
和dataDir
用于避免重复测试中代价高昂的提取+initdb。pexxcrt24#
看看这个:https://github.com/zonkyio/embedded-database-spring-test。需要说明的是,它是用于集成测试的。这意味着Spring上下文在单独测试期间初始化。
根据工具文档,你所需要做的就是将
@AutoConfigureEmbeddedDatabase
注解放在class之上:并添加Maven依赖项:
要将它与
@DataJpaTest
一起使用,您需要使用注解@AutoConfigureTestDatabase(replace = NONE)
禁用默认测试数据库:为了使使用更方便,您还可以创建一个复合注解,例如:
..然后在测试类上面使用它:
czq61nw15#
您可以尝试https://github.com/TouK/dockds。这会自动配置docker包含的数据库。