1 package junit.framework; 2 3 import java.util.List; 4 5 import org.junit.Ignore; 6 import org.junit.runner.Describable; 7 import org.junit.runner.Description; 8 import org.junit.runner.Request; 9 import org.junit.runner.Runner; 10 import org.junit.runner.manipulation.Filter; 11 import org.junit.runner.manipulation.Filterable; 12 import org.junit.runner.manipulation.Orderer; 13 import org.junit.runner.manipulation.InvalidOrderingException; 14 import org.junit.runner.manipulation.NoTestsRemainException; 15 import org.junit.runner.manipulation.Orderable; 16 import org.junit.runner.manipulation.Sorter; 17 18 /** 19 * The JUnit4TestAdapter enables running JUnit-4-style tests using a JUnit-3-style test runner. 20 * 21 * <p> To use it, add the following to a test class: 22 * <pre> 23 public static Test suite() { 24 return new JUnit4TestAdapter(<em>YourJUnit4TestClass</em>.class); 25 } 26 </pre> 27 */ 28 public class JUnit4TestAdapter implements Test, Filterable, Orderable, Describable { 29 private final Class<?> fNewTestClass; 30 31 private final Runner fRunner; 32 33 private final JUnit4TestAdapterCache fCache; 34 JUnit4TestAdapter(Class<?> newTestClass)35 public JUnit4TestAdapter(Class<?> newTestClass) { 36 this(newTestClass, JUnit4TestAdapterCache.getDefault()); 37 } 38 JUnit4TestAdapter(final Class<?> newTestClass, JUnit4TestAdapterCache cache)39 public JUnit4TestAdapter(final Class<?> newTestClass, JUnit4TestAdapterCache cache) { 40 fCache = cache; 41 fNewTestClass = newTestClass; 42 fRunner = Request.classWithoutSuiteMethod(newTestClass).getRunner(); 43 } 44 countTestCases()45 public int countTestCases() { 46 return fRunner.testCount(); 47 } 48 run(TestResult result)49 public void run(TestResult result) { 50 fRunner.run(fCache.getNotifier(result, this)); 51 } 52 53 // reflective interface for Eclipse getTests()54 public List<Test> getTests() { 55 return fCache.asTestList(getDescription()); 56 } 57 58 // reflective interface for Eclipse getTestClass()59 public Class<?> getTestClass() { 60 return fNewTestClass; 61 } 62 getDescription()63 public Description getDescription() { 64 Description description = fRunner.getDescription(); 65 return removeIgnored(description); 66 } 67 removeIgnored(Description description)68 private Description removeIgnored(Description description) { 69 if (isIgnored(description)) { 70 return Description.EMPTY; 71 } 72 Description result = description.childlessCopy(); 73 for (Description each : description.getChildren()) { 74 Description child = removeIgnored(each); 75 if (!child.isEmpty()) { 76 result.addChild(child); 77 } 78 } 79 return result; 80 } 81 isIgnored(Description description)82 private boolean isIgnored(Description description) { 83 return description.getAnnotation(Ignore.class) != null; 84 } 85 86 @Override toString()87 public String toString() { 88 return fNewTestClass.getName(); 89 } 90 filter(Filter filter)91 public void filter(Filter filter) throws NoTestsRemainException { 92 filter.apply(fRunner); 93 } 94 sort(Sorter sorter)95 public void sort(Sorter sorter) { 96 sorter.apply(fRunner); 97 } 98 99 /** 100 * {@inheritDoc} 101 * 102 * @since 4.13 103 */ order(Orderer orderer)104 public void order(Orderer orderer) throws InvalidOrderingException { 105 orderer.apply(fRunner); 106 } 107 }