簡體   English   中英

更改Unitils DbUnitModule的TestListener

[英]Change TestListener for Unitils DbUnitModule

我正在嘗試使用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()以便返回您的自定義偵聽器。

看到這個職位的一個例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM