Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试预期超时_Java_Unit Testing_Testing_Junit - Fatal编程技术网

Java JUnit测试预期超时

Java JUnit测试预期超时,java,unit-testing,testing,junit,Java,Unit Testing,Testing,Junit,我有一个通过TCP套接字进行通信的测试,当我发送某条消息时,我希望服务器不会在设定的时间范围内做出响应 服务器的行为是我无法控制的 如果考试没有在规定的时间内完成,我知道如何让考试不及格。但我如何才能做相反的事情,让它成为没有在规定时间内完成的借口 我可以使用@Test(timeout=1000)使测试在一秒钟内无法完成时失败 但是,使用JUnit4,是否有一个函数可以测试预期的超时作为肯定结果?也就是说,如果在时间范围内完成,测试将失败,否则将通过?好问题。实际上,您只能使用junit工具来实

我有一个通过TCP套接字进行通信的测试,当我发送某条消息时,我希望服务器不会在设定的时间范围内做出响应

服务器的行为是我无法控制的

如果考试没有在规定的时间内完成,我知道如何让考试不及格。但我如何才能做相反的事情,让它成为没有在规定时间内完成的借口

我可以使用
@Test(timeout=1000)
使测试在一秒钟内无法完成时失败


但是,使用JUnit4,是否有一个函数可以测试预期的超时作为肯定结果?也就是说,如果在时间范围内完成,测试将失败,否则将通过?

好问题。实际上,您只能使用
junit
工具来实现这一点。我的想法是反转
Timeout
规则行为+使用
Test
注释的
expected
属性。唯一的一个限制:您必须将测试放在单独的类中,因为
规则
适用于其中的所有测试:

public class Q37355035 {

    private static final int MIN_TIMEOUT = 100;

    @Rule
    public Timeout timeout = new Timeout(MIN_TIMEOUT) {
        public Statement apply(Statement base, Description description) {
            return new FailOnTimeout(base, MIN_TIMEOUT) {
                @Override
                public void evaluate() throws Throwable {
                    try {
                        super.evaluate();
                        throw new TimeoutException();
                    } catch (Exception e) {}
                }
            };
        }
    };

    @Test(expected = TimeoutException.class)
    public void givesTimeout() throws InterruptedException {
        Thread.sleep(1000);
    }
}

我是在Andremoniy的伟大答案的基础上建立起来的,如果你喜欢这个答案,别忘了给他的答案投票

如果测试没有在预期的时间范围内完成,我使用以下修改跳过测试。这样做的好处是JUnit会将测试标记为跳过,而不是成功。这有利于乐观地执行测试,这些测试有时可能挂起或完成得不够快,但您不希望将它们标记为失败或删除它们

public class OptimisticTestClass {

    private static final int TEST_METHOD_TIMEOUT_MS = 100;

    @Rule
    public Timeout timeout = new Timeout(TEST_METHOD_TIMEOUT_MS, TimeUnit.MILLISECONDS) {
        public Statement apply(Statement base, Description description) {
            return new FailOnTimeout(base, TEST_METHOD_TIMEOUT_MS) {
                @Override
                public void evaluate() throws Throwable {
                    try {
                        super.evaluate();
                    } catch (TestTimedOutException e) {
                        Assume.assumeNoException("Test did not finish in the allocated time, skipping!", e);
                    }
                }
            };
        }
    };

    // The test times out and is skipped
    public void givesTimeout() throws InterruptedException {
        Thread.sleep(1000);
    }
}

超时是否引发异常?如果是,您可以测试超时异常。请小心,我认为您不能期望
超时引发的异常。您可以使用计时器,或者只是检查操作的时间,然后,如果超过您想要的时间,抛出您期望的异常。但是似乎不是很有效。另外,测试的目的是什么?如果它超出了您的代码的作用域,则在服务器的下游,我不确定在您的端进行测试有多大好处。如果希望代码处理超时,那么应该模拟套接字并将异常抛出。