如何在 Spring 测试 Dbunit 中做自定义数据库 setup/teardown?

How to do a custom database setup/teardown in Spring Test Dbunit?

我想知道如何创建自定义 setups/teardown,主要是为了修复 cyclyc 引用问题,我可以在其中使用 Spring Test Dbunit http://springtestdbunit.github.io/spring-test-dbunit/index.html 插入自定义 SQL 命令。

是否有我可以使用的注释或如何对其进行自定义?

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

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

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

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

这是您可以使用的片段:

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: also have a look on dbunit doc about how to export data贴给你了。

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

之前订购它

另一个可能更好的解决方案是重新设计您的数据库以消除循环。您可能会删除从 companycompany_config 的引用,并在 company_config table:

中将唯一索引添加到 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