JUnit 5,尽管@Timeout,测试没有失败



我想知道我缺少了什么,但我用@Timeout进行的JUnit 5测试并没有失败。

这是我的测试课程:

package tests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import main.SomeClass;
class SomeUtilsTest {
@Test
@Timeout (5)
void testSomething() {
assertEquals (1, SomeClass.doSomething());
}
}

这是我正在测试的类:

package main;
public class SomeClass {
public static Integer doSomething() {
while (true);
}
}

它应该在五秒钟后失败,但无论我等多久,测试都不会失败;程序继续到";运行";,我只能手动终止它。

如果使用@Timeout注释配置的测试的执行时间超过给定的持续时间,则该测试将失败。如果超过超时时间,则执行测试的线程将从另一个线程中断,然后有望完成。

在您的情况下,中断什么也不做,因为您没有执行任何阻塞操作,所以您的测试将永远运行。

相反,您可以使用assertTimeoutPreemptively方法之一—请参阅文档。在您的示例中:

assertTimeoutPreemptively(Duration.ofSeconds(5), SomeClass::doSomething);

请注意,这将使用一个单独的线程来执行SomeClass::doSomething。因此,您需要确保所需的一切(用于单独线程中的实际计算,或用于主线程中的后续断言(都是正确可见的。

对我来说,下面的代码就是解决方案。当长时间运行的计算和负责停止该计算的代码在同一线程中运行时,Timeout似乎没有按预期工作。

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Timeout.ThreadMode.SEPARATE_THREAD;
class SomeUtilsTest {
@Test
@Timeout(value = 3, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD)
void testSomething() {
assertEquals (1, SomeClass.doSomething());
}
}

最新更新