以@RunWith(Theories.class)为例,如下图:
主要是RunnerBuilder的逻辑,AllDefaultPossibilitiesBuilder的runnerForClass会自动加载5个Builder, 然后一次遍历这5个builder,执行safeRunnerForClass方法生成runner,如果有一个builder返回的runner不为空,那么直接将这个runner返回,不再遍历其他builder,后面走的就是JunitCore的run(Runner runner)方法,具体参考https://blog.csdn.net/newbaby2012/article/details/118461573
这里runner的加载,其实是通过RunnerBuilder的子类(比如AnnotatedBuilder)调用runnerForClass:
@Override
public Runner runnerForClass(Class<?> testClass) throws Exception {
for (Class<?> currentTestClass = testClass; currentTestClass != null;
currentTestClass = getEnclosingClassForNonStaticMemberClass(currentTestClass)) {
RunWith annotation = currentTestClass.getAnnotation(RunWith.class);
if (annotation != null) {
return buildRunner(annotation.value(), testClass);
}
}
return null;
}
然后builderRunner里面通过getConstruct以及newInstance来加载并返回runner的,本文就是Theories:
public Runner buildRunner(Class<? extends Runner> runnerClass,
Class<?> testClass) throws Exception {
try {
return runnerClass.getConstructor(Class.class).newInstance(testClass);
} catch (NoSuchMethodException e) {
try {
return runnerClass.getConstructor(Class.class,
RunnerBuilder.class).newInstance(testClass, suiteBuilder);
} catch (NoSuchMethodException e2) {
String simpleName = runnerClass.getSimpleName();
throw new InitializationError(String.format(
CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
}
}
}