JUnit和InterruptedException

时间:2017-01-22 15:53:04

标签: java junit interrupted-exception

我在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)怎么样?它不会扔任何东西。超时后如何停止?

3 个答案:

答案 0 :(得分:1)

超时规则在单独的线程中运行每个测试,并等待超时。超时后,线程被中断。然后测试运行器将继续进行下一个测试。它不会等待对中断的任何响应,因此测试可以在后台继续运行。

infiniteLoop不会抛出任何InterruptedException,但会在剩余的测试运行时继续运行。

完成所有测试后,运行测试的JVM通常会终止,以及其中的所有线程。因为线程被标记为守护线程,或者通过System.exit调用。

参见源代码:

答案 1 :(得分:0)

它应该在两个测试中抛出,@ Rule注释为每个测试附加一个计时器。如果测试运行超过20ms,则会触发异常。因此,在您的程序中,第二个测试也应该触发InterruptedException。

答案 2 :(得分:0)

我尝试了以下代码并且它正常工作(即两个测试因超时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声明(当前不推荐使用的声明)。< / p>