データベースやファイルなどの外部リソースとのやり取りが非常に多いため、春のバッチジョブを「単体」テストするのは非常に困難です。私が持っているアプローチには2つのレベルがあります。
タスクレットの個々のメソッドは、通常どおりユニット テストされます。通常のモックまたはスタブを使用して、JUnit テストからメソッドを直接呼び出すだけです。
次に、メイン メソッドを直接呼び出して、JUnit テストからバッチを実行し、必要なすべてのインフラストラクチャを配置します。バッチ ジョブには、データベースといくつかの入力ファイルが必要です。私のJUnitテストは、そのテストに必要なすべてのファイルを一時ディレクトリ(私は通常mavenを使用target/it
しています)とデータベース(HSQLDB形式で保存されたMySQLデータベースのコピーを持っています)にコピーします。次に、正しいパラメーターを使用して直接呼び出しMain.main()
、バッチを実行して結果を確認し、正しいファイルが生成されたかどうか、データベースが正しく変更されたかどうかなどを確認します。
これには、作業方法としていくつかの利点があります。
- これらのテストは Eclipse から実行できるため、テストするたびに完全なパッケージをビルドする必要がないため、デバッグ サイクルが短縮されます。
- ビルドに組み込むのは簡単です。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 から開始します。 . これは、少し面倒な場合があります。