【发布时间】:2021-11-14 12:59:39
【问题描述】:
在单元测试中考虑下面的代码,我在预填充的 SQLite 数据库中添加了一个新的 Tag 对象。
@Test // Line 1
public void add() {
Tag tagToAdd = new Tag("Tall");
Tag addedTag = this.tagDao.add(tagToAdd);
assertNotNull(addedTag);
assertEquals(3L, addedTag.getId()); // Line 6
assertEquals(tagToAdd.getTag(), addedTag.getTag());
List<Tag> tags = this.tagDao.get();
assertEquals(3, tags.size());
}
在第 6 行,我希望标签的 ID 为 3,因为该字段是 AUTOINCREMENT,并且测试是使用已经包含 2 个标签的数据库初始化的。这在我每次运行测试时都可以正常工作,并且 ID 始终为 3。
现在,我正在将 flyway 集成到项目中。每次运行测试,AUTOINCREMENT从上次运行的值开始,所以每次运行Tag ID加1,测试失败。
关于如何让 flyway 始终将数据库重置为全新状态并重置 AUTOINCREMENT 值的任何想法?我可以编写一个查询来手动完成,但这是不可维护的。
到目前为止我尝试了什么?
- 集成@FlywayTest,因为这会执行flyway task clean
- 定义了一个FlywayMigrationStrategy bean,其中包含flyway.clean()
- 在我的 application.properties 中将 spring.flyway.clean-on-validation-error 设置为 true(也就是说,我的 sql 没有变化,所以不确定这是否改变了任何东西)
-- 编辑 我的第一个迁移脚本包含以下内容。
DROP TABLE IF EXISTS Tag;
CREATE TABLE Tag(
id INTEGER PRIMARY KEY AUTOINCREMENT,
tag VARCHAR(255) NOT NULL UNIQUE,
createdDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modifiedDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
【问题讨论】:
-
在每次测试之前重新创建或清理数据库是一种很好的做法,可以确保测试始终以正确的初始状态运行。 flyway.clean() 删除配置模式中的所有对象,因此如果在每次测试执行之前运行它,则每次都应该从空数据库开始。你提到你已经尝试过了。这对你有用吗?
标签: database spring-boot sqlite junit flyway