package org.junit.internal.requests; import org.junit.internal.builders.AllDefaultPossibilitiesBuilder; import org.junit.internal.builders.SuiteMethodBuilder; import org.junit.runner.Runner; import org.junit.runners.model.RunnerBuilder; public class ClassRequest extends MemoizingRequest { /* * We have to use the f prefix, because IntelliJ's JUnit4IdeaTestRunner uses * reflection to access this field. See * https://github.com/junit-team/junit4/issues/960 */ private final Class fTestClass; private final boolean canUseSuiteMethod; public ClassRequest(Class testClass, boolean canUseSuiteMethod) { this.fTestClass = testClass; this.canUseSuiteMethod = canUseSuiteMethod; } public ClassRequest(Class testClass) { this(testClass, true); } @Override protected Runner createRunner() { return new CustomAllDefaultPossibilitiesBuilder().safeRunnerForClass(fTestClass); } private class CustomAllDefaultPossibilitiesBuilder extends AllDefaultPossibilitiesBuilder { @Override protected RunnerBuilder suiteMethodBuilder() { return new CustomSuiteMethodBuilder(); } } /* * Customization of {@link SuiteMethodBuilder} that prevents use of the * suite method when creating a runner for fTestClass when canUseSuiteMethod * is false. */ private class CustomSuiteMethodBuilder extends SuiteMethodBuilder { @Override public Runner runnerForClass(Class testClass) throws Throwable { if (testClass == fTestClass && !canUseSuiteMethod) { return null; } return super.runnerForClass(testClass); } } }