如何在运行时定义JUnit测试超时(即没有注释)?

时间:2014-12-15 11:02:36

标签: java unit-testing testing junit timeout

我想运行一个单元测试,其中包含在运行时定义的超时。我想仅为特定测试定义超时,而不是整个类。

我看到这些是设定时间的方法:

@Rule
public Timeout globalTimeout = new Timeout(10000); // 10 seconds max per method tested

@Test(timeout=100) public void infinity() {
   while(true);
}

但是当我运行此代码时,不会抛出任何异常。 我想确定测试因超时而失败的时间。

public Timeout testTimeout;

private void setTestTimeOut() {
    if (!Strings.isNullOrEmpty(testTimeOut)) {
        testTimeout = new Timeout(Integer.parseInt(testTimeOut));
    }
}

如何捕捉异常?用try-catch(InterruptException)包裹主要方法?

2 个答案:

答案 0 :(得分:2)

添加TestWatcher规则,该规则在运行时决定是否应用超时:

@Rule
public TestWatcher watcher = new TestWatcher() {
  @Override
  public Statement apply(Statement base, Description description) {
    // You can replace this hard-coded test name and delay with something
    // more dynamic
    if (description.getMethodName().equals("infinity")) {
      return new FailOnTimeout(base, 200);
    }

    return base;
  }
};

您的原始方法无效,因为JUnit规则在测试代码开始运行之前生效,因此在测试中调整Timeout对象的任何尝试都为时已晚。

答案 1 :(得分:-1)

@Test(timeout=xxx)不会抛出TimeoutException,它将无法通过测试。

您能否详细说明您想要测试的内容?