我正在嘗試使用Unitils來幫助我進行數據庫測試。我想使用Unitils/DBMaintain功能來禁用約束。但是這有幾個問題。我不希望使用DBMaintain爲我創建我的數據庫,但是我希望使用它的約束禁用功能。我能夠通過使用自定義模塊的下面列出來實現這一目標:更改UnitL的TestListener DbUnitModule
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數據庫的特定模式和表級別上的約束?
感謝
+1你能告訴我這個嗎?該鏈接不起作用。我正在嘗試擴展DbUnitModule以允許加載視圖而不僅僅是表格。 – Mukus 2013-01-28 07:13:45