blob: d9f072baacb698973f726507162c072d25659f11 [file] [log] [blame]
package org.junit.runners;
import static org.junit.Assert.assertEquals;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
/**
* Tests that verify proper behavior for custom runners that extend
* {@link BlockJUnit4ClassRunner}.
*
* @author Sam Brannen
* @since 4.13
*/
public class CustomBlockJUnit4ClassRunnerTest {
@Test
public void exceptionsFromMethodBlockMustNotResultInUnrootedTests() throws Exception {
TrackingRunListener listener = new TrackingRunListener();
RunNotifier notifier = new RunNotifier();
notifier.addListener(listener);
new CustomBlockJUnit4ClassRunner(CustomBlockJUnit4ClassRunnerTestCase.class).run(notifier);
assertEquals("tests started.", 2, listener.testStartedCount.get());
assertEquals("tests failed.", 1, listener.testFailureCount.get());
assertEquals("tests finished.", 2, listener.testFinishedCount.get());
}
public static class CustomBlockJUnit4ClassRunnerTestCase {
@Test public void shouldPass() { /* no-op */ }
@Test public void throwException() { /* no-op */ }
}
/**
* Custom extension of {@link BlockJUnit4ClassRunner} that always throws
* an exception from the {@code methodBlock()} if a test method is named
* exactly {@code "throwException"}.
*/
private static class CustomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {
CustomBlockJUnit4ClassRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
protected Statement methodBlock(FrameworkMethod method) {
if ("throwException".equals(method.getName())) {
throw new RuntimeException("throwException() test method invoked");
}
return super.methodBlock(method);
}
}
/**
* Simple {@link RunListener} that tracks the number of times that
* certain callbacks are invoked.
*/
private static class TrackingRunListener extends RunListener {
final AtomicInteger testStartedCount = new AtomicInteger();
final AtomicInteger testFailureCount = new AtomicInteger();
final AtomicInteger testFinishedCount = new AtomicInteger();
@Override
public void testStarted(Description description) throws Exception {
testStartedCount.incrementAndGet();
}
@Override
public void testFailure(Failure failure) throws Exception {
testFailureCount.incrementAndGet();
}
@Override
public void testFinished(Description description) throws Exception {
testFinishedCount.incrementAndGet();
}
}
}