上一篇我们回答了之前在梳理流程时遇到的一些问题,并思考了为什么要这么设计。

本篇是《如何高效阅读源码》专题的第十二篇,通过项目之间的联系来进行扩展阅读,通过项目与项目之间的联系更好的理解项目。

本节内容:

  • TestRunner的执行流程

  • Spring如何整合JUnit

在我们使用Spring的项目中进行测试时,一般都需要添加下面一行注解:

@RunWith(SpringRunner.class


为什么要使用这个注解呢?为了回答这个问题,我们先来了解一下TestRunner是如何执行的。

TestRunner的执行流程

在前面梳理的执行流程中,我们已经知道了JUnitCore是整个测试的入口,它构建了Runner实例,而Runner通过测试类构建了对应的测试模型,并通过Statement来执行,通过TestNotifier来通知TestListener来处理测试结果。

但是我们还没有梳理出JUnitCore是如何构建出Runner的,现在我们从JUnitCore入手,将最后一块拼图补全,梳理出一个完整的测试执行流程。

入口方法很简单,委托给了runMain方法来执行。

这里只是将命令行参数parse为一个对象,然后通过参数配置来执行测试。

注意到这里的addListener了吗?这里构建了一个TextListener,通过addListener添加到了TestNotifier中。前面我们已经知道,测试结果是通过TestNotifier来通知TestListener的,而这里就是向TestNotifier中添加TestListener实例的。这里就补齐了前面流程中缺的一块拼图。

最后一行通过createRequest方法构建了一个Request来执行测试

这里的run方法就是构建了基本的测试执行流程,调用了runner对象的run方法来执行具体的测试。前面我们已经梳理了TestRunner的方法的具体流程,这里就将我们前面梳理的流程完整的串联起来了。

注意上面的request.getRunner,现在我们只需要梳理出Request是如何获取到runner的,那么整个执行流程就完整了。
让我们回过头来看createRequest方法。

这里通过Request的静态方法classes来构建Request。

这里构建了一个AllDefaultPossibilitiesBuilder实例,通过builder实例来构建Runner。篇幅限制,我们就直接到AllDefaultPossibilitiesBuilder的runnerForClass方法,来看看builder是怎么构建Runner的。

首先,构建了5个默认的RunnerBuilder,然后通过对应的RunnerBuilder来构建Runner,如果构建成功了,则直接返回对应的Runner去执行测试。

注意最后一个builder方法junit4Builder,从名字我们可以知道它是用来构建JUnit4Runner的,我们点进去确认一下。

的确是创建JUnit4对象的。

至此,我们整个的执行流程就梳理出来了:

  • JUnitCore根据参数,通过Request和Builder构建了对应的Runner实例

  • Runner通过测试类构建了对应的测试模型,并通过Statement来执行,通过TestNotifier来通知TestListener来处理测试结果

Spring如何整合JUnit

上面的流程和Spring整合JUnit有什么关系呢?

前面我们知道Spring测试需要添加一个注解RunWith,我们注意上面的builder方法,其中有个builder方法是annotatedBuilder,我们来看这个方法。

此方法通过RunWith注解,找到了对应的类,然后进行了实例化,作为Runner进行返回。注意上面AllDefaultPossibilitiesBuilder的runnerForClass方法的循环,如果找到了Runner就直接返回了,而annotatedBuilder是比较靠前的,所以获取到Runner后就不会再执行后面的builder了。Spring中就是使用SpringRunner来执行测试了。

而SpringRunner又是如何执行测试的呢?结合前面梳理的Runner流程,你可以自己尝试去梳理看看。

总结

本文通过Spring如何结合JUnit的例子梳理出了JUnit4完整的执行流程,以及梳理出Spring结合JUnit的方式。通过此方式讲述了如何通过关联延伸阅读将多个项目整合起来,更好的理解项目之间的关系。

下文将讲解不同版本之间源码的阅读。

Spring是如何整合JUnit的?JUnit源码关联延伸阅读的更多相关文章

  1. Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码)

    Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码) 备注: 之前在Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合中 ...

  2. 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)

    目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...

  3. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  4. Spring中AOP相关的API及源码解析

    Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...

  5. Spring Boot核心技术之Rest映射以及源码的分析

    Spring Boot核心技术之Rest映射以及源码的分析 该博客主要是Rest映射以及源码的分析,主要是思路的学习.SpringBoot版本:2.4.9 环境的搭建 主要分两部分: Index.ht ...

  6. (转)把hadoop源码关联到eclipse工程

    把hadoop源码关联到eclipse工程     转:http://www.superwu.cn/2013/08/04/355 在eclipse中阅读源码非常方便,利于我们平时的学习,下面讲述如何把 ...

  7. Junit 3.8源码分析

    JUnit背景介绍 JUnit是由Erich Gamma和Kent Beck 编写的一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓的白 ...

  8. SpringBoot 整合 spring security oauth2 jwt完整示例 附源码

    废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...

  9. 快速开发架构Spring Boot 从入门到精通 附源码

    导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...

随机推荐

  1. 浅谈arguments属性callee

    1.首先 arguments 是一个对应于传递给函数的参数的类数组对象 2. arguments.callee 属性包含当前正在执行的函数. 描述 callee 是 arguments 对象的一个属性 ...

  2. Java 将Map按Value值降序排列

    1 /** 2 * 将集合按照降序排列-FLOAT 3 * @param nowPartTwoData 4 * @return 5 */ 6 private static List<Map.En ...

  3. 使用flex的同时设置超出喜爱是省略号,

    超出宽度,显示省略号 overflow:hidden; white-space:nowrap; text-overflow:ellipsis; 需要注意的是,在移动端在flex元素中的内容进行省略文字 ...

  4. 【Python打包成exe方法】——已解决导入第三方包无法打包的问题

    ​ 前言 在我们写代码的过程中,我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安 ...

  5. C++---使用类

    运算符重载 概念 运算符重载就是想法转换, 目的是简化函数调用的方式 重载就是赋予新的含义, 运算符重载也是, 即同一个运算符可以有不同的功能 C++本身已经对一些运算符进行了重载, 同时C++允许程 ...

  6. Pinpoint介绍及docker安装方式

    一.介绍 Pinpoint是用Java编写的大型分布式系统的APM(Application Performance Management应用程序性能管理)工具,受Dapper论文的启发,Pinpoin ...

  7. Vue 中 axios 跨域配置 (!!!配置完成需要重新运行,不然也不起作用)

    当拿到一个网址如:https://music.163.com/store/api/categorypage/list  获取数据是出现如下: 证明该网址不能非常直观的拿到数据.接下来我们试试跨域拿这个 ...

  8. jq大体架构。先记录再慢慢剖析

    //工具方法 Utilities //回调函数列表 Callbacks Object //异步队列 Deferred Object //浏览器功能测试 Support //数据缓存 Data //队列 ...

  9. oracle提交后再回滚解决办法

    BEGIN; 刚才改错数据,直接commit了,rollback了下,没效果,经过google,oracle有个 闪回 功能,经测试,可用. -- 查询闪回id 如:06001B00054E0000 ...

  10. v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码

    本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...