我正在尝试使用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。