/* * Copyright 2008 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.powermock.modules.junit4.legacy.internal.impl; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.internal.runners.BeforeAndAfterRunner; import org.junit.internal.runners.InitializationError; import org.junit.internal.runners.TestClassRunner; import org.junit.runner.manipulation.NoTestsRemainException; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; import org.powermock.core.spi.PowerMockTestListener; import org.powermock.modules.junit4.common.internal.PowerMockJUnitRunnerDelegate; import org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestClassMethodsRunner; import org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestIntrospector; import org.powermock.reflect.Whitebox; import org.powermock.tests.utils.impl.MockPolicyInitializerImpl; /** * A JUnit4 legacy (i.e. v4.0-4.3) test runner that only runs a specified set of * test methods in a test class. * * <p> * Most parts of this class is essentially a rip off from * {@link TestClassRunner} used in JUnit 4.3. * * @see TestClassRunner * */ public class PowerMockJUnit4LegacyRunnerDelegateImpl extends TestClassRunner implements PowerMockJUnitRunnerDelegate { private final int testCount; public PowerMockJUnit4LegacyRunnerDelegateImpl(Class<?> klass, String[] methodsToRun, PowerMockTestListener[] listeners) throws InitializationError, NoTestsRemainException { super(klass, new PowerMockJUnit4LegacyTestClassMethodsRunner(klass, listeners == null ? new PowerMockTestListener[0] : listeners)); filter(new PowerMockJUnit4LegacyFilter(methodsToRun)); testCount = methodsToRun.length; } public PowerMockJUnit4LegacyRunnerDelegateImpl(Class<?> klass, String[] methodsToRun) throws InitializationError, NoTestsRemainException { this(klass, methodsToRun, null); } @Override public void run(final RunNotifier notifier) { BeforeAndAfterRunner runner = new BeforeAndAfterRunner(getTestClass(), BeforeClass.class, AfterClass.class, null) { @Override protected void runUnprotected() { fEnclosedRunner.run(notifier); } @Override protected void addFailure(Throwable targetException) { notifier.fireTestFailure(new Failure(getDescription(), targetException)); } }; Whitebox.setInternalState(runner, "fTestIntrospector", new PowerMockJUnit4LegacyTestIntrospector(getTestClass()), BeforeAndAfterRunner.class); // Initialize mock policies for each test final ClassLoader classLoader = this.getClass().getClassLoader(); new MockPolicyInitializerImpl(getTestClass()).initialize(classLoader); Thread.currentThread().setContextClassLoader(classLoader); runner.runProtected(); } public int getTestCount() { return testCount; } @Override public Class<?> getTestClass() { return super.getTestClass(); } }