• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  *
3  */
4 package org.junit.internal.builders;
5 
6 import org.junit.runner.RunWith;
7 import org.junit.runner.Runner;
8 import org.junit.runners.model.InitializationError;
9 import org.junit.runners.model.RunnerBuilder;
10 
11 public class AnnotatedBuilder extends RunnerBuilder {
12 	private static final String CONSTRUCTOR_ERROR_FORMAT= "Custom runner class %s should have a public constructor with signature %s(Class testClass)";
13 
14 	private RunnerBuilder fSuiteBuilder;
15 
AnnotatedBuilder(RunnerBuilder suiteBuilder)16 	public AnnotatedBuilder(RunnerBuilder suiteBuilder) {
17 		fSuiteBuilder= suiteBuilder;
18 	}
19 
20 	@Override
runnerForClass(Class<?> testClass)21 	public Runner runnerForClass(Class<?> testClass) throws Exception {
22 		RunWith annotation= testClass.getAnnotation(RunWith.class);
23 		if (annotation != null)
24 			return buildRunner(annotation.value(), testClass);
25 		return null;
26 	}
27 
buildRunner(Class<? extends Runner> runnerClass, Class<?> testClass)28 	public Runner buildRunner(Class<? extends Runner> runnerClass,
29 			Class<?> testClass) throws Exception {
30 		try {
31 			return runnerClass.getConstructor(Class.class).newInstance(
32 					new Object[] { testClass });
33 		} catch (NoSuchMethodException e) {
34 			try {
35 				return runnerClass.getConstructor(Class.class,
36 						RunnerBuilder.class).newInstance(
37 						new Object[] { testClass, fSuiteBuilder });
38 			} catch (NoSuchMethodException e2) {
39 				String simpleName= runnerClass.getSimpleName();
40 				throw new InitializationError(String.format(
41 						CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
42 			}
43 		}
44 	}
45 }