如何正确预填充数据库以使用 Spock 和 Spring Boot 进行集成测试
How properly prepopulate DB for integration tests with Spock and Spring Boot
我可能会提供我的问题的完整 GitHub 示例,但目前我只是问 - 也许有人遇到过类似的问题。
问题是 - 对于 Spock 和 Spring Boot,我想 运行 集成测试并在 'setup' 方法中预填充 H2 数据库的本地实例。我创建了几个可以互为父对象的对象。所以我创建了例如。 Human1 和 Human2,从序列中获取他们生成的 ID,然后准备 REST JSON 调用,Human1 id 为 'parentId' 属性 并使 POST 到 API以 Human1 作为父对象创建 Human3。
我的 API 解析检索到的 DTO,提取 'parentId' 值,并使用方法 'findOne(id)' 使用存储库执行搜索。问题是,在这个阶段,存储库声称数据库中没有内容(适当 table)。
我试过弄乱@Transactional(它在我的 Spock 规范和映射器 class 的方法上),在设置中保存和刷新,分别刷新存储库和数千个其他东西但似乎没有任何效果。所以请 - 如果有人至少可以阐明这个问题,我将不胜感激。
所以我终于偶然发现了 @BeforeTransaction 注释,它非常有用。我将我的数据库 insert/delete 逻辑放在用 @BeforeTransaction 注释的单独方法中,它在单独事务中的每个测试方法之前调用,该事务在与测试方法关联的其他事务之前关闭开始。这解决了问题。
我可能会提供我的问题的完整 GitHub 示例,但目前我只是问 - 也许有人遇到过类似的问题。
问题是 - 对于 Spock 和 Spring Boot,我想 运行 集成测试并在 'setup' 方法中预填充 H2 数据库的本地实例。我创建了几个可以互为父对象的对象。所以我创建了例如。 Human1 和 Human2,从序列中获取他们生成的 ID,然后准备 REST JSON 调用,Human1 id 为 'parentId' 属性 并使 POST 到 API以 Human1 作为父对象创建 Human3。
我的 API 解析检索到的 DTO,提取 'parentId' 值,并使用方法 'findOne(id)' 使用存储库执行搜索。问题是,在这个阶段,存储库声称数据库中没有内容(适当 table)。
我试过弄乱@Transactional(它在我的 Spock 规范和映射器 class 的方法上),在设置中保存和刷新,分别刷新存储库和数千个其他东西但似乎没有任何效果。所以请 - 如果有人至少可以阐明这个问题,我将不胜感激。
所以我终于偶然发现了 @BeforeTransaction 注释,它非常有用。我将我的数据库 insert/delete 逻辑放在用 @BeforeTransaction 注释的单独方法中,它在单独事务中的每个测试方法之前调用,该事务在与测试方法关联的其他事务之前关闭开始。这解决了问题。