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 16 public AnnotatedBuilder(RunnerBuilder suiteBuilder) { 17 fSuiteBuilder= suiteBuilder; 18 } 19 20 @Override 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 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 }