我正在尝试使用Unitils来协助我进行数据库测试。我想使用Unitils / DBMaintain功能禁用约束。但是,这存在一些问题。我不想使用DBMaintain为我创建数据库,但是我希望使用其约束禁用功能。我可以通过使用下面列出的自定义模块来实现此目的:

public class DisableConstraintModule implements Module {

     private boolean disableConstraints = false;

     public void afterInit() {
         if (disableConstraints) {
             DatabaseUnitils.disableConstraints();
         }
     }

     public void init(Properties configuration) {
         disableConstraints = PropertyUtils.getBoolean("Database.disableConstraints", false, configuration);
     }
}


这部分地解决了我想要的问题,但是我希望只能对将在测试中使用的表禁用约束。我的测试将针对具有多个模式的数据库运行,每个模式都有数百个不同的表。 DatabaseUnitils.disableConstraints()禁用每个模式中每个表的约束,这将非常耗时并且是不必要的。

在搜索dbmaintain代码后,我发现Db2Database类确实包含一个用于禁用基于特定模式和表名的约束的函数,但是此方法受到了保护。我可以通过扩展Db2Database类或使用反射来访问它。

接下来,我需要确定我感兴趣的架构和表。我可以通过观察@DataSet批注来确定,这些架构和表基于xml中的内容来确定哪些是重要的。为此,我需要覆盖TestListener,以便可以在尝试插入数据集之前指示它使用xml禁用约束。这是我的尝试:

public class DisableConstraintModule extends DbUnitModule {

    private boolean disableConstraints = false;

    private TableBasedConstraintsDisabler disabler;

    public void afterInit() {
    }

    public void init(Properties configuration) {
        disableConstraints = PropertyUtils.getBoolean("Database.disableConstraints", false, configuration);

        PropertyUtils.getInstance("org.unitils.dbmaintainer.structure.ConstraintsDisabler.implClassName", configuration);
    }

    public void disableConstraintsForDataSet(MultiSchemaDataSet dataSet) {
        disabler.disableConstraints(dataSet);
    }


    protected class DbUnitCustomListener extends DbUnitModule.DbUnitListener {

        @Override
        public void beforeTestSetUp(Object testObject, Method testMethod) {
            disableConstraintsForDataSet(getDataSet(testMethod, testObject));
            insertDataSet(testMethod, testObject);
        }
    }

 }


这是我想做的,但是我无法获取@DataSet注释来触发我的DbUnitCustomListener,而是调用了默认的DBUnitModule DbUnitListener。无论如何,在使用@DataSet批注时,是否有我要覆盖哪个侦听器被调用的方法?或者是否有更好的方法来针对DB2数据库禁用特定模式和表级别的约束?

谢谢

最佳答案

您必须告诉Unitils使用DbUnitModule的子类。您可以使用unitils.properties文件中的unitils.module.dbunit.className属性来执行此操作。听起来您已经了解了这一部分。

第二部分是重写DbUnitModule的getTestListener()以便返回您的自定义侦听器。

有关示例,请参见此post

09-13 05:25