![](/img/trans.png)
[英]How to throw `InterruptedException` while junit testing my class?
[英]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
調用。
查看源代碼:
System.exit
Eclipse測試運行程序。 在兩個測試中都應該拋出該異常,@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.