我正在尝试使用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数据库的特定模式和表级别的约束?
由于
答案 0 :(得分:1)
你必须告诉Unitils使用你的DbUnitModule子类。您可以使用unitils.properties文件中的unitils.module.dbunit.className属性执行此操作。听起来你已经弄清楚了这一部分。
第二部分是覆盖DbUnitModule的getTestListener()以返回自定义侦听器。
有关示例,请参阅此post。