package bsh;
import org.junit.experimental.categories.Category;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import java.util.Iterator;
import java.util.List;
public class FilteredTestRunner extends BlockJUnit4ClassRunner {
public FilteredTestRunner(final Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected List<FrameworkMethod> getChildren() {
final List<FrameworkMethod> children = super.getChildren();
final Iterator<FrameworkMethod> iterator = children.iterator();
while (iterator.hasNext()) {
final FrameworkMethod child = iterator.next();
final Category category = child.getAnnotation(Category.class);
if (category != null) {
final Class<?>[] value = category.value();
for (final Class<?> categoryClass : value) {
if (TestFilter.class.isAssignableFrom(categoryClass)) {
try {
final TestFilter testFilter = (TestFilter) categoryClass.newInstance();
if (testFilter.skip()) {
System.out.println("skipping test " + child.getMethod() + " due filter " + categoryClass.getSimpleName());
iterator.remove();
break;
}
} catch (final InstantiationException e) {
throw new AssertionError(e);
} catch (final IllegalAccessException e) {
throw new AssertionError(e);
}
}
}
}
}
return children;
}
}