2017-01-22 48 views
0

私はJUnitのドキュメントで、次の例を見つけました:のJUnitとInterruptedExceptionある

public static class HasGlobalLongTimeout { 

    @Rule 
    public Timeout globalTimeout= new Timeout(20); 

    @Test 
    public void run1() throws InterruptedException { 
     Thread.sleep(100); 
    } 

    @Test 
    public void infiniteLoop() { 
     while (true) {} 
    } 
} 

私はJUnitのは、最初のテストを中断しようとするたび、それが実行されているスレッドを中断し、それがスローされますことを理解しInterruptedExceptionが発生し、テストが終了します。

しかし、2番目のテスト(infiniteLoop)はどうですか?それは何も投げていない。タイムアウト後にどのように停止しますか?

答えて

1

タイムアウトルールは、各テストを別のスレッドで実行し、タイムアウトを待ちます。タイムアウト後、スレッドは中断されます。テストランナーは、次のテストに進みます。割り込みに対する応答を待つことはないので、テストはバックグラウンドで自由に実行できます。

infiniteLoopInterruptedExceptionを投げず、残りのテストが実行されている間は実行を続けます。

すべてのテストが終了すると、テストを実行しているJVMは通常、その中のすべてのスレッドとともに終了します。スレッドがデーモンスレッドとしてマークされているか、またはSystem.exitコールを使用しているためです。

は、ソースコードを参照してください

+0

あなたのコメントから(そしてソースコードを見て)、junitはタイムアウトでスレッドに参加しようとし、タイムアウト後にまだ実行中であるかどうかをチェックします。そうであれば、テストは失敗します。つまり、テストがバックグラウンドで実行されていても、失敗した参加の呼び出し後に失敗します。 – sapito

0

@Ruleアノテーションは、両方のテストでスローされる必要があります。@Ruleアノテーションは、各テストにタイマーを付加します。テストが20ms以上実行されると、例外が発生します。したがって、あなたのプログラムでは、2回目のテストでもInterruptedExceptionが発生するはずです。

+0

2番目のテストを単独で行った場合はどうなりますか?タイムアウトがあっても永遠に走れるのでしょうか? – sapito

+0

いいえ、それはまだタイムアウトがあるので、 'InterrupedException'をスローします。注釈により、コードはそのテストに例外をローカライズできますが、この場合、もう一方のテストでは別の例外がスローされます。 –

+0

このInterruptedExceptionはどこにスローされますか?それは私にはかなり混乱しているようです:)それは2番目のテストは全く何も投げることができないようだ、それは単なるループです。 – sapito

0

私は以下のコードを試してみましたが、正しく動作します(タイムアウトが20msで両方のテストが失敗しました)。私はJava 8とJUnit 4.12を使用しています。私はクラス宣言でstatic修飾子を削除

import java.util.concurrent.TimeUnit; 

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.Timeout; 

public class HasGlobalLongTimeout { 

    @Rule 
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS); 

    @Test 
    public void run1() throws InterruptedException { 
     Thread.sleep(100); 
    } 

    @Test 
    public void infiniteLoop() { 
     while (true) { 
     } 
    } 
} 

お知らせ(限り私はそれを知っているように、クラスのために許可されていない)と私は(1つは、現在推奨されていません)Timeout宣言を変更しました。

関連する問題