先上一个在Spring-test下运行的调用栈

自底向上:
JUnitStarter
IDEA对JUnit的支持,调用JUnitCore.run(Runner),将注解@RunWith指定的Runner作为参数传给JUnit。该方法注释“Do not use. Testing purposes only.”,
 
JUnitCore
运行JUnit测试的入口。通过调用run()方法启动测试。
 
Runner
testcase运行的容器。JUnit默认使用BlockJUnit4ClassRunner。
鼓励扩展实现自己的Runner。例如Spring-test扩展BlockJUnit4ClassRunner实现了SpringJUnit4ClassRunner。
 
RunNotifier
在testcase开始、结束、成功、失败、忽略时,通知JUnit。
 
RunListener
测试运行事件的监听器。默认只有一个listener,在Result类内部定义,用来记录测试开始时间、耗时、成功个数、失败个数。
如果需要自定义的listener,扩展RunListener,并通过JUnitCore.addListener()添加。
 
Runner.run()
看下run方法的实现

  public void run(final RunNotifier notifier) {
EachTestNotifier testNotifier = new EachTestNotifier(notifier,
getDescription());
try {
Statement statement = classBlock(notifier);
statement.evaluate();
} catch (AssumptionViolatedException e) {
testNotifier.fireTestIgnored();
} catch (StoppedByUserException e) {
throw e;
} catch (Throwable e) {
testNotifier.addFailure(e);
}
}
EachTestNotifier
没看懂这个类的用意,内部类也没有文档,可能是为了以后扩展留的吧。
 
Statement
一个Statement是运行测试时的一段指令。看下classBlock()的实现:
protected Statement classBlock(final RunNotifier notifier) {
Statement statement = childrenInvoker(notifier);
statement = withBeforeClasses(statement);
statement = withAfterClasses(statement);
statement = withClassRules(statement);
return statement;
}
classBlock构建了一个Statement的责任链。
第一个statement: 将所有@Test标记的方法在RunnerScheduler中执行,默认的实现是串行执行的。有没有并行执行的实现?
第二个statement:将@BeforeClass标记的方法封装成Statement,并放在责任链第一位。
第三个statement:将@AfterClass标记的方法封装成Statement,并放在责任链第一位。但是RunAfters的实现会先执行fNext(即上一步封装的RunBefores),再执行自己封装的方法。这里的实现跟当初设计fNext这个域的初衷有点不一致。
第四个statement:@ClassRule注解,工作中没用过,改天再详细了解。
 
接下来就是依次执行statement链了。
 
 

JUnit4源码学习笔记的更多相关文章

  1. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

  2. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  3. AXI_LITE源码学习笔记

    AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...

  4. Hadoop源码学习笔记(6)——从ls命令一路解剖

    Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...

  5. Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构

    Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...

  6. Hadoop源码学习笔记(4) ——Socket到RPC调用

    Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...

  7. Hadoop源码学习笔记(3) ——初览DataNode及学习线程

    Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...

  8. Hadoop源码学习笔记(2) ——进入main函数打印包信息

    Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...

  9. Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

    Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...

随机推荐

  1. [工作积累] Tricks with UE4 PerInstanceRandom

    最近在用UE4的Instancing, 发现限制很多. Unity有instancing的attribute array (uniform/constant buffer),通过InstanceID来 ...

  2. vue原生table合并单元格并可编辑

    <template> <div> <div class="el-card box-card table_container"> <div ...

  3. sqlserver数据库知识点总结(转)

  4. 修复因为存储空间问题引起的nexus 服务启动异常

      故障描述 因为nexus所在服务器存储空间满了, 做了部分清理操作,结果nexus 启动异常,提示错误信息基本类似如下: build 285537d2767275f460df32c6a3be01b ...

  5. Eamon 埃蒙

    发售年份 1980 平台 AppleII 开发商 Donald Brown 类型 文字冒险 https://www.youtube.com/watch?v=uvZIxnIvRG8

  6. Https网络安全架构设计

    一.对称加密 对称密钥加密(Symmetric-key algorithm)又称对称加密.私钥加密.共享密钥加密,是密码学中的一类加密算法.这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地 ...

  7. js驗證網址URL格式

    /^((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)? ...

  8. Java annotation浅析

    自定义annotation @Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD,ElementType.M ...

  9. squid http,https, 代理,默认端口3128

    squid http,https, 代理,默认端口3128 https 代理时出现 403,是因为squid默认允许 192.168.0.0 网段代理 在配置文件中,““acl localnet sr ...

  10. 如何在本地同时管理github仓库和codingnet仓库?

    本文的前提条件是你在电脑上接入了github或者gitlab的仓库,现在要接入codingnet的仓库. 电脑上已经有了 github 的 ssh key,怎么继续接入codingnet 的git仓库 ...