3

私は現在、Java アプリケーションの 1 つのテスト ケースを作成しようとしています。私のコードでは、私の Java アプリケーションはバッチ ファイルを呼び出します。バッチ ファイルは別の Java プロセスを開始し、呼び出し元の Java アプリケーションから消費する必要があるエラー コードを返します。バッチファイルを呼び出すために、次のことを行っています。

Process process = runTime.exec(new String[]{"cmd.exe","/c",scriptPath});
exitValue = process.waitFor();

バッチファイルは次のとおりです。

@echo off
cd %~dp0
java -cp  frames.FrameDriver
SET exitcode=%errorlevel%
exit /B %exitcode%

上記のコードとバッチ ファイルを使用すると、JUnit フレームワークは、この特定のテスト ケースが終了するのを待っているかのように停止します。JUnit がテスト ケースでハングしているときに、タスク マネージャーに移動し、java.exe プロセスを終了すると、JUnit フレームワークは他のケースを続行できます。

.bat ファイルをダブルクリックして実行すると、Java アプリケーションが正常に実行されます。

STARTバッチ ファイル内のコマンドの前にバッチ コマンドを追加するjavaと、ハングアップの問題が解決するようですが、Java アプリケーションから正しい終了コードを取得できないようです。これは常に 0 であるためです。(Java アプリケーションは、システムを使用してエラー コードで終了します。 .exit(INTEGER_VALUE))。%errorlevel% 値が「開始」コマンド自体の終了値によって上書きされていると想定しています。

誰でもこの問題を解決する方法を教えてもらえますか?

ありがとう。

PS: 違いがある場合は、JDK 5 と Netbeans 5.5.1 を使用しています。

4

1 に答える 1

3

終了時に/Bを使用しないでください。スクリプトを実行する方法は次のとおりです。

@ECHO off
ECHO Running %~nx0 in %~dp0
CALL :myfunction World
java.exe -cp  frames.FrameDriver
IF NOT ERRORLEVEL 0 (
  SET exitcode=1
) ELSE (
  SET exitcode=0
)
GOTO :END
:myfunction
ECHO Hello %~1
EXIT /B 0
:END
EXIT %exitcode%

注: また、次の 3 つの方法で Java プログラムを実行できます。

  java.exe -cp  frames.FrameDriver
  CALL java.exe -cp  frames.FrameDriver
  cmd.exe /c java.exe -cp  frames.FrameDriver

Java コマンドが終了コードで終了する可能性があり、終了コードを ERRORLEVEL var に正しく渡すには、上記の正しい方法を使用する必要があるため、これは非常に重要です。

于 2013-05-29T23:59:27.257 に答える