View Javadoc

1   package junit.runner;
2   
3   import java.lang.reflect.*;
4   import junit.runner.*;
5   import junit.framework.*;
6   
7   /***
8    * An implementation of a TestCollector that loads
9    * all classes on the class path and tests whether
10   * it is assignable from Test or provides a static suite method.
11   * @see TestCollector
12   */
13  public class LoadingTestCollector extends ClassPathTestCollector {
14  	
15  	TestCaseClassLoader fLoader;
16  	
17  	public LoadingTestCollector() {
18  		fLoader= new TestCaseClassLoader();
19  	}
20  	
21  	protected boolean isTestClass(String classFileName) {	
22  		try {
23  			if (classFileName.endsWith(".class")) {
24  				Class testClass= classFromFile(classFileName);
25  				return (testClass != null) && isTestClass(testClass);
26  			}
27  		} 
28  		catch (ClassNotFoundException expected) {
29  		}
30  		catch (NoClassDefFoundError notFatal) {
31  		} 
32  		return false;
33  	}
34  	
35  	Class classFromFile(String classFileName) throws ClassNotFoundException {
36  		String className= classNameFromFile(classFileName);
37  		if (!fLoader.isExcluded(className))
38  			return fLoader.loadClass(className, false);
39  		return null;
40  	}
41  	
42  	boolean isTestClass(Class testClass) {
43  		if (hasSuiteMethod(testClass))
44  			return true;
45  		if (Test.class.isAssignableFrom(testClass) &&
46  			Modifier.isPublic(testClass.getModifiers()) &&
47  			hasPublicConstructor(testClass)) 
48  			return true;
49  		return false;
50  	}
51  	
52  	boolean hasSuiteMethod(Class testClass) {
53  		try {
54  			testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]);
55  	 	} catch(Exception e) {
56  	 		return false;
57  		}
58  		return true;
59  	}
60  	
61  	boolean hasPublicConstructor(Class testClass) {
62  		try {
63  			TestSuite.getTestConstructor(testClass);
64  		} catch(NoSuchMethodException e) {
65  			return false;
66  		}
67  		return true;
68  	}
69  }