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 }