Maven (プラグイン バージョン 1.7) と Aspectj-1.8.3 を使用しています。
私のシナリオは次のとおりです。テストしたいインストーラー jar があります。インストーラーは別の jar、Apache のユーティリティ commons-exec-1.3 をラップする my-common.jar ライブラリを使用し、それを使用してコマンドを実行します。私が書いたメソッドは次のようになります。
public static int execCommand(String command) throws ExecuteException, IOException, InterruptedException {
logger.debug("About to execute command: ", command);
CommandLine commandLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
executor.setProcessDestroyer(new ShutdownHookProcessDestroyer());
ExecuteWatchdog watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT);
executor.setWatchdog(watchdog);
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
executor.execute(commandLine, resultHandler);
return 0;
}
問題は、私のテストが別の jar、つまりインストーラーを実行し、インストーラー jar が別の jar を実行するため (app.jar という名前を付けます)、インストーラーが終了し、app.jar が実行され続けることです (最初に、インストーラー分割払いを行って環境を準備してから、app.jar を実行します)、テスト スイートが完了してもアプリ jar は終了しません (これは私の意図であり、本番環境での想定方法です)。
グローバルな目標は、統合テスト スイートで作成されているすべてのプロセスを強制終了することです。
私の解決策: プロセス ID は にのみ公開されるjava.lang.UNIXProcess
ため、すべてのプロセス ID を収集し、テスト スイートの最後で手動で終了することを考えました。
私はこのようなアスペクトを置くことを考えました:
static Collection<Integer> PidsToKill = new LinkedList<Integer>();
@After("!cflow(within(IntegrationTestsAspects)) && call(* java.lang.UNIXProcess.destroyProcess(int))&&args(pid)")
public void foo3(int pid) {
PidsToKill.add(new Integer(pid));
}
これは、コードの一部を再設計せずに問題を解決するという私の考えでした。そのため、統合テスト スイートで作成されているすべてのサブプロセスを確実に終了させる方法を探しています。
どんな解決策も歓迎されます。