なぜそれを呼び出すのSystem.exit()
ですか?System.exit()
そして、ユニットテストでカバーしているレベルでそれが呼び出されるのはなぜですか?
既存のコードをテストする場合、テストでプロセスを生成し、計画どおりに終了したことを確認できます。他の機能をテストしたい場合は、テスト対象のコードにそのような厄介な副作用がないように、アプリケーションをより適切に構成してください。
System.exit()
ただし、一般的には、個々のスレッドが呼び出されることは、アーキテクチャが悪いことを示す強力な指標であると言えます。他のスレッドにクリーンアップの機会を与えることなく、アプリケーション全体を即座に強制終了できるスレッドがある場合、すぐにかなりの問題に遭遇する可能性があります。
また、スレッドが何らかのグローバル シャットダウン ハンドラー (テストでオーバーライドできる) を呼び出す場合、System.exit()
その機能のテストに問題はありません。
更新:レガシ コードを扱うときの最初のステップはSystem.exit()
、テストで置き換えることができる場所に を分離することです。たとえば、次のようなクラスを作成します。
// "Singleton" with replaceable instance
public class ShutdownHandler {
private static ShutdownHandler instance = new ShutdownHandler();
public static ShutdownHandler getInstance() {
return instance;
}
public synchronized void shutdown() {
// default implementation
System.exit();
}
public static void setInstance(ShutdownHandler newInstance) {
// (probably also check that this is only called in a test environment)
instance = newInstance;
}
}
System.exit()
次に、すべての呼び出しを に置き換えますShutdownHandler.getInstance().shutdown()
。これにより、アプリケーションの機能がまったく変更されることはありません。しかし、テスト内のインスタンスを、いくつかのフラグを設定し、終了する代わりに例外をスローする実装に置き換えることができShutdownHandler
ます。その後、テストでそのフラグをチェックして、アプリが終了したかどうかを判断できます。
また、Robert C. Martin による "Working Effectsly With Legacy Code" をお勧めします。これは、古い混乱を管理可能なものに変える方法についてのアイデアです。