我在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)怎么样?它不会扔任何东西。超时后如何停止?
答案 0 :(得分:1)
超时规则在单独的线程中运行每个测试,并等待超时。超时后,线程被中断。然后测试运行器将继续进行下一个测试。它不会等待对中断的任何响应,因此测试可以在后台继续运行。
infiniteLoop
不会抛出任何InterruptedException
,但会在剩余的测试运行时继续运行。
完成所有测试后,运行测试的JVM通常会终止,以及其中的所有线程。因为线程被标记为守护线程,或者通过System.exit
调用。
参见源代码:
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>