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 }