我对通过TCP套接字的通信进行了测试,我希望服务器在发送特定消息时不会在设置的时间范围内响应。

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

如果测试未在设定的时间内完成,我知道如何使测试失败。但是,我该如何做相反的事情,以确保在规定时间内未完成?

如果一秒钟内未完成,我可以使用@Test (timeout=1000)使测试失败。

但是,使用Junit 4,是否有功能可以测试预期超时是否为肯定结果?即如果在规定时间内完成测试,测试将失败,如果未通过,则测试通过?

最佳答案

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

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);
    }
}

07-24 09:39
查看更多