我使用Flyway来处理数据库迁移。一切正常:迁移文件的默认位置是:
main/resource/db/migration/V1...
我正在运行集成测试,我的设置使用单独的数据库模式进行集成,我也想用flyway管理它。
但是,集成测试位于test
文件夹(不是main
)中。当Flyway bean执行migrate()
时,它找不到迁移文件,因为它们位于main
文件夹中。如果我将迁移文件放在test/resource/db/migration/V1...
中就可以了。
我真的不想将这些文件复制到test
资源文件夹中,因此我不必同时维护这两个文件。有没有办法强制Flyway使用与普通应用程序相同的迁移文件进行集成测试?
答案 0 :(得分:6)
我假设您正在使用Maven?对于单元测试,test/resources
和main/resources
都会加载到类路径中。 test/resources
文件通常优先,因为它们位于类路径的较高位置 - 如果我没记错的话。无论如何,我不建议你这样做。
相反,我建议您为一个单独的目录(即test/resources/integration/migration/
)中的集成测试制作完全不同的Flyway配置,并在main/resources/db/migration
默认值之后运行。
即使这样,不使用Flyway设置集成数据夹具也可能更容易,而是使用其他一些数据库数据加载工具,如DbUnit(我确定还有其他工具)。
答案 1 :(得分:6)
另一个提示: 对于数据库单元测试,您还可以使用Flyway测试扩展,请参阅https://github.com/flyway/flyway-test-extensions。
这些扩展还有一个用于数据加载的DbUnit集成插件,因此您可以控制测试环境中的数据库设置。
Adams的回答是正确的不将您的真实数据库设置脚本复制到test/resources/db/migration/
。
对于集成测试设置,您还可以执行以下选项之一或组合:
flyway-maven-plugin
或gradle设置,为脚本位置添加特殊文件夹test/resources/integration/migration/
。test/resources/db/migration/
并使用特殊版本,例如 V999.0.x __ 或simular。在这种情况下,flyway将始终填充数据库中所有检测到的脚本。 数据库集成测试提示: