01: package org.junit.internal.requests;
02:
03: import org.junit.Ignore;
04: import org.junit.internal.runners.InitializationError;
05: import org.junit.internal.runners.JUnit38ClassRunner;
06: import org.junit.internal.runners.JUnit4ClassRunner;
07: import org.junit.runner.Request;
08: import org.junit.runner.RunWith;
09: import org.junit.runner.Runner;
10: import org.junit.runners.AllTests;
11:
12: public class ClassRequest extends Request {
13: private static final String CONSTRUCTOR_ERROR_FORMAT = "Custom runner class %s should have a public constructor with signature %s(Class testClass)";
14: private final Class<?> fTestClass;
15: private boolean fCanUseSuiteMethod;
16:
17: public ClassRequest(Class<?> testClass, boolean canUseSuiteMethod) {
18: fTestClass = testClass;
19: fCanUseSuiteMethod = canUseSuiteMethod;
20: }
21:
22: public ClassRequest(Class<?> testClass) {
23: this (testClass, true);
24: }
25:
26: @Override
27: public Runner getRunner() {
28: return buildRunner(getRunnerClass(fTestClass));
29: }
30:
31: public Runner buildRunner(Class<? extends Runner> runnerClass) {
32: try {
33: return runnerClass.getConstructor(Class.class).newInstance(
34: new Object[] { fTestClass });
35: } catch (NoSuchMethodException e) {
36: String simpleName = runnerClass.getSimpleName();
37: InitializationError error = new InitializationError(String
38: .format(CONSTRUCTOR_ERROR_FORMAT, simpleName,
39: simpleName));
40: return Request.errorReport(fTestClass, error).getRunner();
41: } catch (Exception e) {
42: return Request.errorReport(fTestClass, e).getRunner();
43: }
44: }
45:
46: Class<? extends Runner> getRunnerClass(final Class<?> testClass) {
47: if (testClass.getAnnotation(Ignore.class) != null)
48: return new IgnoredClassRunner(testClass).getClass();
49: RunWith annotation = testClass.getAnnotation(RunWith.class);
50: if (annotation != null) {
51: return annotation.value();
52: } else if (hasSuiteMethod() && fCanUseSuiteMethod) {
53: return AllTests.class;
54: } else if (isPre4Test(testClass)) {
55: return JUnit38ClassRunner.class;
56: } else {
57: return JUnit4ClassRunner.class;
58: }
59: }
60:
61: public boolean hasSuiteMethod() {
62: try {
63: fTestClass.getMethod("suite");
64: } catch (NoSuchMethodException e) {
65: return false;
66: }
67: return true;
68: }
69:
70: boolean isPre4Test(Class<?> testClass) {
71: return junit.framework.TestCase.class
72: .isAssignableFrom(testClass);
73: }
74: }
|