Open Source Repository

Home /junit/junit-4.10 | Repository Home


org/junit/internal/builders/AnnotatedBuilder.java
/**
 
 */
package org.junit.internal.builders;

import org.junit.runner.RunWith;
import org.junit.runner.Runner;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;

public class AnnotatedBuilder extends RunnerBuilder {
  private static final String CONSTRUCTOR_ERROR_FORMAT= "Custom runner class %s should have a public constructor with signature %s(Class testClass)";

  private RunnerBuilder fSuiteBuilder;

  public AnnotatedBuilder(RunnerBuilder suiteBuilder) {
    fSuiteBuilder= suiteBuilder;
  }

  @Override
  public Runner runnerForClass(Class<?> testClassthrows Exception {
    RunWith annotation= testClass.getAnnotation(RunWith.class);
    if (annotation != null)
      return buildRunner(annotation.value(), testClass);
    return null;
  }

  public Runner buildRunner(Class<? extends Runner> runnerClass,
      Class<?> testClassthrows Exception {
    try {
      return runnerClass.getConstructor(Class.class).newInstance(
          new Object[] { testClass });
    catch (NoSuchMethodException e) {
      try {
        return runnerClass.getConstructor(Class.class,
            RunnerBuilder.class).newInstance(
            new Object[] { testClass, fSuiteBuilder });
      catch (NoSuchMethodException e2) {
        String simpleName= runnerClass.getSimpleName();
        throw new InitializationError(String.format(
            CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
      }
    }
  }
}