5

Spring Batch ジョブで以下のシナリオをテストするアプローチは何でしょうか。

1) Spring バッチジョブのステップで実行される独立したタスクレット。

2) 複数のステップで構成されるジョブで、一部のステップには itemreader、itemprocessor、itemwriters があり、一部のステップにはタスクレットがあります。

3) アイテム リーダーへの入力クエリが、多くのテーブルからの結合を持つ非常に複雑な SQL クエリであるアイテムリーダー - このシナリオでは、使用されているすべてのテーブルを空にして、テスト用にダミー データを入力することはできません。言い換えれば、テストのためにテーブルを空にすることができない現実のシナリオが存在する可能性があります。その場合のアプローチはどうあるべきですか?

採用するアプローチについてこのフォーラムで少し助けがあれば、さまざまなジョブ シナリオで Spring バッチ ジョブをテストする例を含むサンプル スイートを用意したいと思います。

4

1 に答える 1

8

データベースやファイルなどの外部リソースとのやり取りが非常に多いため、春のバッチジョブを「単体」テストするのは非常に困難です。私が持っているアプローチには2つのレベルがあります。

タスクレットの個々のメソッドは、通常どおりユニット テストされます。通常のモックまたはスタブを使用して、JUnit テストからメソッドを直接呼び出すだけです。

次に、メイン メソッドを直接呼び出して、JUnit テストからバッチを実行し、必要なすべてのインフラストラクチャを配置します。バッチ ジョブには、データベースといくつかの入力ファイルが必要です。私のJUnitテストは、そのテストに必要なすべてのファイルを一時ディレクトリ(私は通常mavenを使用target/itしています)とデータベース(HSQLDB形式で保存されたMySQLデータベースのコピーを持っています)にコピーします。次に、正しいパラメーターを使用して直接呼び出しMain.main()、バッチを実行して結果を確認し、正しいファイルが生成されたかどうか、データベースが正しく変更されたかどうかなどを確認します。

これには、作業方法としていくつかの利点があります。

  1. これらのテストは Eclipse から実行できるため、テストするたびに完全なパッケージをビルドする必要がないため、デバッグ サイクルが短縮されます。
  2. ビルドに組み込むのは簡単です。Maven のフェイルセーフ プラグインに含めるだけです。

いくつかの警告があります:

SecurityManager 内でメイン メソッドを実行する必要があります。メインが System.exit() を呼び出す場合、JVM を停止させたくありません。SecurityManager の例については、org.junit.tests.running.core.MainRunnerを参照してください。これは次のように呼ばれます。

Integer exitValue = new MainRunner().runWithCheckForSystemExit(new Runnable() {
    public void run() {
    Main.main(new String[] {});
  }
});

上記を使用すると、バッチが失敗時に正しい値で System.exit() を呼び出すことをアサートでき、失敗条件のテストも可能になります。

次に、JUnit テストから多くのセットアップを行うことができますが、すべてを行うことはできません。たとえば、FTP サーバーが必要な場合は、通常、フェイルセーフ プラグインが実行される前に、JUnit ではなく Maven から開始します。 . これは、少し面倒な場合があります。

于 2012-10-30T10:05:53.293 に答える