2012-07-13 61 views
1

我正在嘗試使用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

你必須告訴Unitils使用您DbUnitModule的子類。您可以使用unitils.properties文件中的unitils.module.dbunit.className屬性執行此操作。聽起來你已經弄清楚了這一部分。

第二部分是重寫DbUnitModule的getTestListener()以返回您的自定義偵聽器。

查看這個post的例子。

+0

+1你能告訴我這個嗎?該鏈接不起作用。我正在嘗試擴展DbUnitModule以允許加載視圖而不僅僅是表格。 – Mukus 2013-01-28 07:13:45