JunitCore.runMain call "Result result= run(classes.toArray(new Class[0]));" -- classes是要被测试的类组成的List
JunitCore.run(Class<?>... classes)
JunitCore.run(Request.classes(defaultComputer(), classes)) -- 获得Computer类instance
Request.classes -- 构造AllDefaultPossibilitiesBuilder类的instance, 通过computer.getSuite(builder, classes) 获得 Runner
AllDefaultPossibilitiesBuilder builder= new AllDefaultPossibilitiesBuilder(true);
Runner suite= computer.getSuite(builder, classes); -- 生成Suite类的instance, Suite类构造函数的一个参数classes, 另一个是是继承自RunnerBuilder类的匿名类,实现了基类runnerForClass方法。
-- A RunnerBuilder is a strategy for constructing runners for classes.
new Suite(RunnerBuilder builder, Class<?>[] classes)
this(null, builder.runners(null, classes));
RunnerBuilder.runners(Class<?> parent, Class<?>[] children)
RunnerBuilder.runners(Class<?>[] children) -- 生成一个Runner类型的List, 即ArrayList<Runner> runners。 对于每个被测试类class都获得一个对应的Runner, 放入List
RunnerBuilder.safeRunnerForClass(class)
RunnerBuild.runnerForClass(class) -- 这里根据多态,即调用刚才那个继承自RunnerBuilder类的匿名类所实现的runnerForClass方法.
-- 而这个runnerForClass方法又调用了Computer类的getRunner方法
Runner computer.getRunner(RunnerBuilder builder, Class<?> testClass) -- 这个传入的builder就是刚才构造的AllDefaultPossibilitiesBuilder类的instance
AllDefaultPossibilitiesBuilder.runnerForClass -- 该函数内部创建了所有的RunnerBuild, 并根据被测试的类选择一个适用的RunnerBuilder. 以Junit4Builder为例.
builder = new Junit4Builder()
builder.safeRunnerForClass(testClass)
Junit4Builder.runnerForClass(testClass)
new BlockJUnit4ClassRunner(testClass); -- 在这里生成了最终的Runner, BlockJUnit4ClassRunner类的instance.
-- public class BlockJUnit4ClassRunner extends ParentRunner<FrameworkMethod>
super(testClass) -- 先初始化基类
ParentRunner.ParentRunner(Class<?> testClass)
fTestClass= new TestClass(testClass); -- 用被测试的类构造TestClass类的instance, 保存在ParentRunner的成员变量fTestClass中
TestClass.TestClass -- 初始化TestClass类
addToAnnotationLists(new FrameworkMethod(eachMethod), fMethodsForAnnotations); -- 利用反射,获得被测试的类的所有方法,并根据Annotations的不同,
-- 将不同类别的方法分别放入不同的List. 这些List根据Type的不同,
-- 构成Map. 如
-- private Map<Class<?>, List<FrameworkMethod>> fMethodsForAnnotations=
-- new HashMap<Class<?>, List<FrameworkMethod>>();
BlockJUnit4ClassRunner初始化结束
获得一个BlockJUnit4ClassRunner实例
获得一个Suite类的instance, 其中的一个成员变量fRunners就是之前生成的Runner类型的List, 即ArrayList<Runner> runner
Request.runner(suite) -- 返回一个继承自Request的匿名类,实现了getRunner方法, 而实际上getRunner方法返回的就是参数suite.
JunitCore.run(Request)
JunitCore.run(Request.getRunner) -- 此处的getRunner获取刚才生成的suite
Result result= new Result();
RunListener listener= result.createListener();
fNotifier.addFirstListener(listener);
fNotifier.fireTestRunStarted(runner.getDescription());
Suite.getDescription()
ParentRunner.getDescription() -- Suite是继承自ParentRunner<Runner>
Description.createSuiteDescription(null, null) -- 生成一个代表TestSuite的Description.
ParentRunner.getFilteredChildren()
Suite.getChilderen() -- 返回成员变量fRunners, 即ArrayList<Runner> runners.
filterChild(each)
sortChild(each)
filtered.add(each) -- 对于每个在List里面的Runner, 进行filter,sorted, 然后放到filtered的List里面返回
ParentRunner.describeChild(each) -- 对于每个filter里面的Runner, 调用describeChild
ParentRunner.getDescription() -- 还是调用ParentRunner的getDescription方法,但是调用者已经从刚才的Suite变成了具体的Runner,比如BlockJUnit4ClassRunner,每个Runner
-- 是继承自ParentRunner<FrameworkMethod>
Description.createSuiteDescription(null, null) -- 生成一个代表TestSuite的Description.
new Description(被测试类的名字,被测试类拥有的annotations)
ParentRunner.getFilteredChildren()
BlockJUnit4ClassRunner.getChildren()
BlockJUnit4ClassRunner.computeTestMethods()
TestClass.getAnnotatedMethods -- 返回标注了@Test的测试方法组成的那个List,这个List是由之前TestClass.addToAnnotationLists方法生成的
filterChild(each) -- 对每个在List里面的方法进行filter, sorted, 然后放到filtered的List里面, 返回filtered.
-- ArrayList<T> filtered= new ArrayList<T>();
sortChild(each)
filtered.add(each)
description.addChild(describeChild(child)); -- 对于fitered里面的每个method, 都生成一个TestMethod的Description,然后放到TestSuite的Description里面。
Description.createTestDescription(getTestClass().getJavaClass(),testName(method), method.getAnnotations());
description.addChild(describeChild(child)); -- 对于filter里面的每个Runner,也生辰给一个TestSuite的Description, 然后放到Suite的Description里。
new SafeNotifier().run() -- fNotifier.fireTestRunStarted里面生成一个继承自SafeNotifier的匿名类的instance, 它实现了notifyListener方法,然后调用匿名类的run方法,从而调用其实现的notifyListener方法
RunListener.testRunStarted(Description) -- 从fNotifier中获得每个Listener, 对每个Listener执行testRunStarted, 参数是刚才生成的最顶层的Description.
fStartTime= System.currentTimeMillis(); -- 记录开始执行时间
Runner.run(fNotifier) -- 此时这个Runner就是刚才生成的Suite
..
Statement statement= classBlock(fNotifier)
childrenInvoker(fNotifier) -- 返回一个Statement
new Statement() -- 生成一个继承自Statement类的匿名类的instance, 其实现了evaluate方法
withBeforeClasses(statement);
List<FrameworkMethod> befores= fTestClass.getAnnotatedMethods(BeforeClass.class); -- 先获取被测试Suite是不是有被BeforeClass这个Annotations注解的函数列表
return befores.isEmpty() ? statement : new RunBefores(statement, befores, null); -- 如果没有,则返回statement, 如果有,则生成一个继承自Statement类的RunBefores类的instance,并返回
new RunBefores(Statement next, List<FrameworkMethod> befores, Object target)
withAfterClasses(statement);
List<FrameworkMethod> befores= fTestClass.getAnnotatedMethods(AfterClass.class); -- 先获取被测试Suite是不是有被AfterClass这个Annotations注解的函数列表
return befores.isEmpty() ? statement : new RunAfters(statement, afters, null); -- 如果没有,则返回statement, 如果有,则生成一个继承自Statement类的RunAfters类的instance,并返回
new RunAfters(Statement next, List<FrameworkMethod> afters, Object target)
statement.evaluate() -- 调用刚才生成的那个继承自Statement类的匿名类实现的evaluate方法
ParentRunner.runChildren(fNotifier) -- 调用者是Suite
for (final T each : getFilteredChildren()) -- 调用ParentRunner.getFilteredChidren(), 获得Runner List里面的每个Runner
new Runnable() -- 生成一个Runnable类,其实现了run方法,然后调用这个方法
Runnable.run()
ParentRunner.this.runChild(each, notifier);
Suite.runChild(Runner runner, final RunNotifier notifier)
runner.run(notifier); -- 也就是BlockJUnit4ClassRunner.run ,但是BlockJUnit4ClassRunner没有实现run,所以还是调用基类的run方法
ParentRunner.run()
Statement statement= classBlock(notifier)
childrenInvoker(fNotifier)
new Statement() -- 生成一个继承自Statement类的匿名类的instance, 其实现了evaluate方法
withBeforeClasses(statement);
List<FrameworkMethod> befores= fTestClass.getAnnotatedMethods(BeforeClass.class); -- 先获取被测试类是不是有被BeforeClass这个Annotations注解的函数列表
return befores.isEmpty() ? statement : new RunBefores(statement, befores, null); -- 如果没有,则返回statement, 如果有,则生成一个继承自Statement类的RunBefores类的instance,并返回
new RunBefores(Statement next, List<FrameworkMethod> befores, Object target)
withAfterClasses(statement);
List<FrameworkMethod> befores= fTestClass.getAnnotatedMethods(AfterClass.class); -- 先获取被测试类是不是有被AfterClass这个Annotations注解的函数列表
return befores.isEmpty() ? statement : new RunAfters(statement, afters, null); -- 如果没有,则返回statement, 如果有,则生成一个继承自Statement类的RunAfters类的instance,并返回
new RunAfters(Statement next, List<FrameworkMethod> afters, Object target)
statement.evaluate() -- 调用刚才生成的那个继承自Statement类的匿名类实现的evaluate方法
ParentRunner.runChildren(fNotifier) -- 调用者是lockJUnit4ClassRunner
for (final T each : getFilteredChildren()) -- 调用ParentRunner.getFilteredChidren(), 获得Method List里面的每个Method
new Runnable() -- 生成一个Runnable类,其实现了run方法,然后调用这个方法
Runable.run()
ParentRunner.this.runChild(each, notifier);
BlockJUnit4ClassRunner.runChild(method, notifier) -- 终于进入了BlockJUnit4ClassRunner的runChild
methodBlock(method).evaluate();
methodBlock(method);
BlockJUnit4ClassRunner.createTest() -- 这里会通过反射来生成被测试类的实例
getTestClass().getOnlyConstructor().newInstance();
Statement statement= methodInvoker(method, test);
new InvokeMethod(method, test); -- InvokeMethod继承自Statement
statement= withBefores(method, test, statement); -- 获取被测试类是不是有被Before这个Annotations注解的函数列表,如果没有,则返回statement, 如果有,则生成一个继承自Statement类的Befores类的instance,并返回
statement= withAfters(method, test, statement); -- 获取被测试类是不是有被After这个Annotations注解的函数列表,如果没有,则返回statement, 如果有,则生成一个继承自Statement类的Afters类的instance,并返回
statement.evaluate() -- 会最终调用method方法的执行
method.invokeExplosively() -- 通过反射调用
fMethod.invoke(target, params);