package org.test4j.junit.suitetest.suite;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import org.test4j.junit.annotations.BeforeSuite;
import org.test4j.junit.annotations.TestPath;
import org.test4j.junit.filter.ClasspathFilterFactory;
import org.test4j.junit.filter.FilterFactory;
import org.test4j.junit.filter.finder.TestClazFinder;
import org.test4j.tools.commons.MethodHelper;
import org.test4j.tools.reflector.MethodAccessor;
public class ClassPathSuite extends Suite {
private final Class<?> suiteClass;
public ClassPathSuite(Class<?> suiteClass, RunnerBuilder builder) throws InitializationError {
this(suiteClass, builder, new ClasspathFilterFactory());
}
public ClassPathSuite(Class<?> suiteClass, RunnerBuilder builder, FilterFactory filterFactory)
throws InitializationError {
super(builder, suiteClass, getSortedTestclasses(suiteClass, builder, filterFactory));
this.suiteClass = suiteClass;
}
private static Class<?>[] getSortedTestclasses(Class<?> suiteClass, RunnerBuilder builder,
FilterFactory filterFactory) {
TestPath clazFinder = SuiteHelper.findClazFinder(suiteClass, builder);
TestClazFinder finder = filterFactory.createFinder(clazFinder);
List<Class<?>> testclasses = finder.find();
Collections.sort(testclasses, new Comparator<Class<?>>() {
public int compare(Class<?> o1, Class<?> o2) {
return o1.getName().compareTo(o2.getName());
}
});
return testclasses.toArray(new Class[testclasses.size()]);
}
@Override
public void run(RunNotifier notifier) {
try {
this.runBeforeMethods();
} catch (Exception e) {
notifier.fireTestFailure(new Failure(getDescription(), e));
return;
}
super.run(notifier);
}
/**
* 执行所有@BeforeSuite方法
*
* @throws Exception
*/
private void runBeforeMethods() throws Exception {
for (Method each : suiteClass.getMethods()) {
boolean isBeforeSuiteMethod = each.isAnnotationPresent(BeforeSuite.class);
if (!isBeforeSuiteMethod) {
continue;
}
boolean isPublicStaticVoid = MethodHelper.isPublicStaticVoid(each);
if (isPublicStaticVoid) {
try {
new MethodAccessor<Void>(each).invokeStatic(new String[0]);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
}
}
}