[解決済み】Javaです。System.exit()を呼び出すメソッドをテストするにはどうすればよいですか?
質問
を呼び出すべきいくつかのメソッドがあります。
System.exit()
を特定の入力で使用します。残念ながら、これらのケースをテストすると、JUnit が終了してしまうのです! メソッド呼び出しを新しいスレッドに置いても、次のような理由で解決しないようです。
System.exit()
は、現在のスレッドだけでなく、JVMを終了させます。これに対処するための一般的なパターンがありますか?例えば、私は、スタブの代わりに
System.exit()
?
[EDIT] 問題のクラスは、実はコマンドラインツールで、JUnitの中でテストしようとしているのです。もしかしたら、JUnitはこの仕事に適したツールではないかもしれませんね?補完的なリグレッションテストツールの提案を歓迎します(できればJUnitとEclEmmaとうまく統合するものです)。
解決方法は?
確かに。 Derkeiler.com を提案します。
-
なぜ
System.exit()
?
System.exit(whateverValue) で終了させる代わりに、チェックされていない例外を投げてはどうでしょうか?通常の使用では、それはJVMの最後の捨て身のキャッチャーまでずっと漂い、スクリプトをシャットダウンします(途中でそれをキャッチすることを決定しない限り、それはいつか役に立つかもしれません)。
JUnitのシナリオでは、これはJUnitフレームワークによって捕捉され、JUnitフレームワークが次のように報告します。 このようなテストは失敗し、次のテストにスムーズに進みます。
-
防止する
System.exit()
を使用して実際にJVMを終了させます。
System.exit を呼び出さないようにするセキュリティ・マネージャで実行するようにテストケースを修正し、SecurityException をキャッチしてみてください。
public class NoExitTestCase extends TestCase
{
protected static class ExitException extends SecurityException
{
public final int status;
public ExitException(int status)
{
super("There is no escape!");
this.status = status;
}
}
private static class NoExitSecurityManager extends SecurityManager
{
@Override
public void checkPermission(Permission perm)
{
// allow anything.
}
@Override
public void checkPermission(Permission perm, Object context)
{
// allow anything.
}
@Override
public void checkExit(int status)
{
super.checkExit(status);
throw new ExitException(status);
}
}
@Override
protected void setUp() throws Exception
{
super.setUp();
System.setSecurityManager(new NoExitSecurityManager());
}
@Override
protected void tearDown() throws Exception
{
System.setSecurityManager(null); // or save and restore original
super.tearDown();
}
public void testNoExit() throws Exception
{
System.out.println("Printing works");
}
public void testExit() throws Exception
{
try
{
System.exit(42);
} catch (ExitException e)
{
assertEquals("Exit status", 42, e.status);
}
}
}
2012年12月更新
ウィル
プロポーズ
コメントで
を使って
システムルール
を使用するコードをテストするためのJUnit(4.9+)のルールのコレクションです。
java.lang.System
.
このことは、当初
ステファン・ビルクナー
で
回答
2011年12月に発表しました。
System.exit(…)
を使用します。
ExpectedSystemExit
ルールで確認することができます。System.exit(…)
が呼び出されます。
終了時の状態も確認できますね。
例えば
public void MyTest {
@Rule
public final ExpectedSystemExit exit = ExpectedSystemExit.none();
@Test
public void noSystemExit() {
//passes
}
@Test
public void systemExitWithArbitraryStatusCode() {
exit.expectSystemExit();
System.exit(0);
}
@Test
public void systemExitWithSelectedStatusCode0() {
exit.expectSystemExitWithStatus(0);
System.exit(0);
}
}
関連
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] Firebase クラスにシリアライズするプロパティが見つからない
-
[解決済み] Java の substring() の時間複雑性
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] 親から継承したメソッドの可視性を下げることができない [重複]。
-
[解決済み] ORA-01654: インデックスを拡張できません。
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] init-paramとcontext-param