簡體   English   中英

JUnit和InterruptedException

[英]JUnit and InterruptedException

我在JUnit文檔中找到以下示例:

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,從而導致測試完成。

但是第二個測試(infiniteLoop)呢? 它沒有拋出任何東西。 超時后如何停止?

超時規則在單獨的線程中運行每個測試,並等待超時。 超時后,線程被中斷。 然后,測試跑步者將繼續進行下一個測試。 它不等待對中斷的任何響應,因此測試可以自由地在后台繼續運行。

infiniteLoop不會拋出任何InterruptedException而是在運行所有其余測試的同時繼續運行。

一旦所有測試完成,運行測試的JVM通常就會終止,其中的所有線程也會終止。 因為這些線程被標記為守護程序線程,或者通過System.exit調用。

查看源代碼:

在兩個測試中都應該拋出該異常,@Rule批注將計時器附加到每個測試中。 如果測試運行超過20毫秒,則會引發異常。 因此,在您的程序中,第二個測試也應觸發InterruptedException。

我嘗試了以下代碼,並且它正常運行(即,由於超時20ms,兩個測試均失敗)我正在使用Java 8和JUnit 4.12。

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) {
        }
    }
}

請注意,我在類聲明中刪除了static修飾符(據我所知,對於類而言是不允許的),並且更改了Timeout聲明(當前不推薦使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM