1

データベースのテストを支援するために 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 データベースの特定のスキーマとテーブル レベルの制約を無効にするためのより良いアプローチがありますか?

ありがとう

4

1 に答える 1

1

DbUnitModuleのサブクラスを使用するようにUnitilsに指示する必要があります。これは、unitils.propertiesファイルのunitils.module.dbunit.classNameプロパティを使用して行います。この部分を理解しているようです。

2番目の部分は、カスタムリスナーを返すために、DbUnitModuleのgetTestListener()をオーバーライドすることです。

例については、この投稿を参照してください。

于 2012-07-27T04:20:09.050 に答える