从JUnit测试中捕获并重新抛出异常

Catch and Re-throw Exceptions from JUnit Tests

我正在寻找一种方法来捕获JUnit测试抛出的所有异常,然后重新抛出它们;以便在异常发生时向有关测试状态的错误消息中添加更多详细信息。

JUnit捕获在org.junit.runners.parentrunner中引发的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected final void runLeaf(Statement statement, Description description,
        RunNotifier notifier) {
    EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description);
    eachNotifier.fireTestStarted();
    try {
        statement.evaluate();
    } catch (AssumptionViolatedException e) {
        eachNotifier.addFailedAssumption(e);
    } catch (Throwable e) {
        eachNotifier.addFailure(e);
    } finally {
        eachNotifier.fireTestFinished();
    }
}

很遗憾,此方法是最终的,因此无法重写。另外,由于异常被捕获,例如线程。UncaughtExceptionHandler将不会起作用。我能想到的另一个解决方案是在每个测试周围使用try/catch块,但该解决方案的可维护性不是很强。有人能给我指出一个更好的解决方案吗?


您可以为此创建一个测试规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class BetterException implements TestRule {
  public Statement apply(final Statement base, Description description) {
    return new Statement() {
      public void evaluate() {
        try {
          base.evaluate();
        } catch(Throwable t) {
          throw new YourException("more info", t);
        }
      }
    };
  }
}

public class YourTest {
  @Rule
  public final TestRule betterException = new BetterException();

  @Test
  public void test() {
    throw new RuntimeException();
  }
}