View Javadoc
1   package org.junit.internal.runners;
2   
3   import java.lang.reflect.InvocationTargetException;
4   import java.util.Arrays;
5   import java.util.List;
6   
7   import org.junit.runner.Description;
8   import org.junit.runner.Runner;
9   import org.junit.runner.notification.Failure;
10  import org.junit.runner.notification.RunNotifier;
11  import org.junit.runners.model.InitializationError;
12  
13  public class ErrorReportingRunner extends Runner {
14      private final List<Throwable> causes;
15  
16      private final Class<?> testClass;
17  
18      public ErrorReportingRunner(Class<?> testClass, Throwable cause) {
19          if (testClass == null) {
20              throw new NullPointerException("Test class cannot be null");
21          }
22          this.testClass = testClass;
23          causes = getCauses(cause);
24      }
25  
26      @Override
27      public Description getDescription() {
28          Description description = Description.createSuiteDescription(testClass);
29          for (Throwable each : causes) {
30              description.addChild(describeCause(each));
31          }
32          return description;
33      }
34  
35      @Override
36      public void run(RunNotifier notifier) {
37          for (Throwable each : causes) {
38              runCause(each, notifier);
39          }
40      }
41  
42      @SuppressWarnings("deprecation")
43      private List<Throwable> getCauses(Throwable cause) {
44          if (cause instanceof InvocationTargetException) {
45              return getCauses(cause.getCause());
46          }
47          if (cause instanceof InitializationError) {
48              return ((InitializationError) cause).getCauses();
49          }
50          if (cause instanceof org.junit.internal.runners.InitializationError) {
51              return ((org.junit.internal.runners.InitializationError) cause)
52                      .getCauses();
53          }
54          return Arrays.asList(cause);
55      }
56  
57      private Description describeCause(Throwable child) {
58          return Description.createTestDescription(testClass,
59                  "initializationError");
60      }
61  
62      private void runCause(Throwable child, RunNotifier notifier) {
63          Description description = describeCause(child);
64          notifier.fireTestStarted(description);
65          notifier.fireTestFailure(new Failure(description, child));
66          notifier.fireTestFinished(description);
67      }
68  }