package junit.runner; | |
import java.lang.reflect.*; | |
import junit.runner.*; | |
import junit.framework.*; | |
/** | |
* An implementation of a TestCollector that loads | |
* all classes on the class path and tests whether | |
* it is assignable from Test or provides a static suite method. | |
* @see TestCollector | |
*/ | |
public class LoadingTestCollector extends ClassPathTestCollector { | |
TestCaseClassLoader fLoader; | |
public LoadingTestCollector() { | |
fLoader= new TestCaseClassLoader(); | |
} | |
protected boolean isTestClass(String classFileName) { | |
try { | |
if (classFileName.endsWith(".class")) { | |
Class testClass= classFromFile(classFileName); | |
return (testClass != null) && isTestClass(testClass); | |
} | |
} | |
catch (ClassNotFoundException expected) { | |
} | |
catch (NoClassDefFoundError notFatal) { | |
} | |
return false; | |
} | |
Class classFromFile(String classFileName) throws ClassNotFoundException { | |
String className= classNameFromFile(classFileName); | |
if (!fLoader.isExcluded(className)) | |
return fLoader.loadClass(className, false); | |
return null; | |
} | |
boolean isTestClass(Class testClass) { | |
if (hasSuiteMethod(testClass)) | |
return true; | |
if (Test.class.isAssignableFrom(testClass) && | |
Modifier.isPublic(testClass.getModifiers()) && | |
hasPublicConstructor(testClass)) | |
return true; | |
return false; | |
} | |
boolean hasSuiteMethod(Class testClass) { | |
try { | |
testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]); | |
} catch(Exception e) { | |
return false; | |
} | |
return true; | |
} | |
boolean hasPublicConstructor(Class testClass) { | |
try { | |
TestSuite.getTestConstructor(testClass); | |
} catch(NoSuchMethodException e) { | |
return false; | |
} | |
return true; | |
} | |
} |