001 package org.junit.experimental.runners; 002 003 import java.lang.reflect.Modifier; 004 import java.util.ArrayList; 005 import java.util.List; 006 007 import org.junit.runners.Suite; 008 import org.junit.runners.model.RunnerBuilder; 009 010 /** 011 * If you put tests in inner classes, Ant, for example, won't find them. By running the outer class 012 * with Enclosed, the tests in the inner classes will be run. You might put tests in inner classes 013 * to group them for convenience or to share constants. Abstract inner classes are ignored. 014 * <p> 015 * So, for example: 016 * <pre> 017 * @RunWith(Enclosed.class) 018 * public class ListTests { 019 * ...useful shared stuff... 020 * public static class OneKindOfListTest {...} 021 * public static class AnotherKind {...} 022 * abstract public static class Ignored {...} 023 * } 024 * </pre> 025 */ 026 public class Enclosed extends Suite { 027 /** 028 * Only called reflectively. Do not use programmatically. 029 */ 030 public Enclosed(Class<?> klass, RunnerBuilder builder) throws Throwable { 031 super(builder, klass, filterAbstractClasses(klass.getClasses())); 032 } 033 034 private static Class<?>[] filterAbstractClasses(final Class<?>[] classes) { 035 final List<Class<?>> filteredList= new ArrayList<Class<?>>(classes.length); 036 037 for (final Class<?> clazz : classes) { 038 if (!Modifier.isAbstract(clazz.getModifiers())) { 039 filteredList.add(clazz); 040 } 041 } 042 043 return filteredList.toArray(new Class<?>[filteredList.size()]); 044 } 045 }