如何在 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 可以自动解析您的循环引用或外键。
如果您的数据集包含许多带有外键的表,我可以实现的最自动化的方法:
用少量记录填充您的数据库。在您的示例中:Company、CompanyConfig 并确保满足外键。
使用 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
.
之前订购它
另一个可能更好的解决方案是重新设计您的数据库以消除循环。您可能会删除从 company
到 company_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
。
我想知道如何创建自定义 setups/teardown,主要是为了修复 cyclyc 引用问题,我可以在其中使用 Spring Test Dbunit http://springtestdbunit.github.io/spring-test-dbunit/index.html 插入自定义 SQL 命令。
是否有我可以使用的注释或如何对其进行自定义?
Dbunit 需要按顺序插入语句(xml 行),因为它们是按顺序执行的。没有或魔术参数或注释,因此 dbunit 可以自动解析您的循环引用或外键。
如果您的数据集包含许多带有外键的表,我可以实现的最自动化的方法:
用少量记录填充您的数据库。在您的示例中:Company、CompanyConfig 并确保满足外键。
使用 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
.
另一个可能更好的解决方案是重新设计您的数据库以消除循环。您可能会删除从 company
到 company_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
。