如何在Spring Test Dbunit中进行自定义数据库设置/拆卸?

时间:2015-01-28 16:37:01

标签: java sql spring dbunit spring-test

我想知道如何创建自定义设置/拆卸主要用于修复cyclyc refence问题,我可以使用Spring Test Dbunit http://springtestdbunit.github.io/spring-test-dbunit/index.html插入自定义SQL命令。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

  3. 这是您可以使用的片段:

    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

答案 1 :(得分:0)

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

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

+------------+ 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