Nov 7 2011
Running only a group of test classes
Here’s how to run only a selected group of test classes. Specify your own Runner if you’re not using Mockito.
import java.util.ArrayList;
import java.util.List;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import org.mockito.runners.MockitoJUnitRunner;
public class SelectedTestsRunner implements Runnable {
public static void main(final String[] args) throws Throwable {
final SelectedTestsRunner tests =
new SelectedTestsRunner(new RunnerBuilder() {
@Override
public Runner runnerForClass(final Class<?> theClass)
throws Throwable {
return new MockitoJUnitRunner(theClass);
}
});
tests.add(MyTestClass1.class);
tests.add(MyTestClass2.class);
tests.run();
}
private final RunnerBuilder builder;
private final List<Class<?>> tests;
public SelectedTestsRunner(final RunnerBuilder builder) {
this.builder = builder;
tests = new ArrayList<Class<?>>();
}
private void add(final Class<?> testClass) {
tests.add(testClass);
}
@Override
public void run() {
Runner runner = null;
try {
runner = new Suite(builder, tests.toArray(new Class[0]));
} catch (final InitializationError e) {
e.printStackTrace();
return;
}
final RunNotifier notifier = new RunNotifier();
final ProgressListener progressListener = new ProgressListener();
notifier.addListener(progressListener);
runner.run(notifier);
final StringBuilder status = new StringBuilder();
status.append(”\nSuccessful: ” + progressListener.getSuccessCount());
status.append(”\n Failed: ” + progressListener.getFailCount());
System.err.println(status.toString());
progressListener.processFails(new FailProcessor() {
@Override
public void process(final Failure failure) {
if (failure.getException() != null) {
failure.getException().printStackTrace();
}
}
});
}
private static class ProgressListener extends RunListener {
private final List<Failure> fails = new ArrayList<Failure>();
private final List<Description> finished = new ArrayList<Description>();
@Override
public void testFinished(final Description description) throws Exception {
super.testFinished(description);
finished.add(description);
}
@Override
public void testFailure(final Failure failure) throws Exception {
super.testFailure(failure);
fails.add(failure);
}
public int getSuccessCount() {
return finished.size() - fails.size();
}
public int getFailCount() {
return fails.size();
}
public void processFails(final FailProcessor processor) {
for (final Failure fail : fails) {
processor.process(fail);
}
}
}
private interface FailProcessor {
void process(Failure failure);
}
}