【问题标题】:How to do a custom database setup/teardown in Spring Test Dbunit?如何在 Spring Test Dbunit 中进行自定义数据库设置/拆卸?
【发布时间】:2015-03-27 15:59:24
【问题描述】:

我想知道如何创建自定义设置/拆卸,主要是为了解决循环引用问题,我可以使用 Spring Test Dbunit http://springtestdbunit.github.io/spring-test-dbunit/index.html 插入自定义 SQL 命令。

是否有我可以使用的注释或者如何自定义?

【问题讨论】:

  • 对不起,您需要解决什么问题?也许如果你重新措辞或举一个你的问题的例子?
  • 好的,假设您有一个数据库,其中有一个 Company,并且该 Company 有一个对 CompanyConfig 表的外键引用,该表同时包含对 Company id 的外键引用,所以按顺序要创建一个条目,您首先必须输入具有空 CompanyConfig id 的公司,然后在创建公司和引用公司 id 外键的公司配置后,您可以将公司设置为您创建的 CompanyConfig id。 (我希望这是有道理的)所以可以在 @Before 方法中完成,但我想知道如何使用 SpringTestDbunit 来完成

标签: java sql spring dbunit spring-test


【解决方案1】:

目前没有您可以使用的注释,但您可以创建DbUnitTestExecutionListener 的子类并在beforeTestMethod 中添加自定义逻辑。或者,您可以创建自己的TestExecutionListener 并在DbUnitTestExecutionListener 之前订购它。

另一个可能更好的解决方案是重新设计数据库以消除循环。您可以将引用从company 删除到company_config,并在company_config 表中为company_id 添加唯一索引:

+------------+ 1 0..1 +--------------------------------+ | company |<---------| company_config | +------------+ +--------------------------------+ | company_id | | config_id | | ... | | company_id (fk, notnull, uniq) | +------------+ +--------------------------------+

而不是查看company.config_id 来获取配置,您会使用select * from company_config where company_id = :id

【讨论】:

  • 非常感谢菲尔,我会研究一下,关于数据库设计的非常有趣的说明。
【解决方案2】:

Dbunit 需要按顺序插入语句(xml 行),因为它们是按顺序执行的。没有或魔法参数或注释,因此 dbunit 可以自动解析您的循环引用或外键。

如果您的数据集包含许多带有外键的表,我可以实现的最自动化的方法:

  1. 用少量记录填充您的数据库。在您的示例中:Company、CompanyConfig 并确保满足外键。

  2. 使用 dbunit 导出工具提取数据库样本。

这是一个你可以使用的 sn-ps:

IDatabaseConnection connection = new DatabaseConnection(conn, schema);
configConnection((DatabaseConnection) connection);
// dependent tables database export: export table X and all tables that have a // PK which is a FK on X, in the right order for insertion
String[] depTableNames = TablesDependencyHelper.getAllDependentTables(connection, "company");
IDataSet depDataset = connection.createDataSet(depTableNames);

FlatXmlWriter datasetWriter = new FlatXmlWriter(new FileOutputStream("target/dependents.xml"));
datasetWriter.write(depDataset);

运行此代码后,您将在“dependents.xml”中设置 dbunit 数据,并修复所有循环引用。

我在这里贴了full code:也可以看看dbunit doc about how to export data

【讨论】:

  • 是的,我知道我必须使用数据集,我的问题是如何使用 Spring 使用注释(通过在两个操作中手动将 Company config id 设置为 null)优雅地解决循环引用插入和拆卸测试 DbUnit 注释而不是手动解决方案,换句话说,我如何在我们的项目中通过扩展 Db 单元的 DBTestCase 并覆盖 @Before 和 After 并同时使用弹簧来对数据库进行自定义设置和拆卸测试 dbunit 框架?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多