如何在JUnit测试用例中设置运行时的超时

时间:2014-01-24 09:44:14

标签: java junit

我使用JUnit v4作为测试框架。我想知道如何在Test Case中设置运行时超时?

我正在使用Parameterized测试。其中我有一个Scenario列表,其中包含超时值和其他一些文件。这些Scenario中的每一个都可能有不同的2次超时。

timeout参数无法帮助我实现这一目标。

@Test(timeout = getTimeOut())
public void secureLoginWithLongUsername() {
    // Test case goes here

}

private final long getTimeOut() {
    // I am doing some processing here to calculate timeOut dynamically
    long timeOut = scenario.getTimeOut();
    return timeOut;
}

@Parameters
public static Collection<Scenario[]> getParameters() {

    List<Scenario[]> scenarioList = new ArrayList<Scenario[]>();
    Configuration config = new Configuration();
    List<Scenario> scenarios = config.getScenarios();
    for (Scenario scenario : scenarios) {
        scenarioList.add(new Scenario[] { scenario });
    }

    return scenarioList;
}

public class Configuration {
    private List<Scenario>   scenarios;
    //Some processing here
    public List<Scenario> getScenarios() {
        return scenarios;
    }
}

public class Scenario {
    private long   timeOut;
    private String   name;
    //Some more fields here
}

请帮我详细说明动态设置超时的任何替代方法。

1 个答案:

答案 0 :(得分:1)

我认为,您需要自己构建它,例如:

private Timer timer;

@After
public void terminateTimeout() {
    if (timer != null) {
        timer.cancel();
        timer = null;
    }
}

@Test
public void testTimeout() throws Exception {
    setTimeout(1000);
    // run test...
}

private void setTimeout(int duration) {
    final Thread currentThread = Thread.currentThread();
    timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            currentThread.interrupt();
        }
    }, duration);
}