Spring是如何整合JUnit的?JUnit源码关联延伸阅读
上一篇我们回答了之前在梳理流程时遇到的一些问题,并思考了为什么要这么设计。
本篇是《如何高效阅读源码》专题的第十二篇,通过项目之间的联系来进行扩展阅读,通过项目与项目之间的联系更好的理解项目。
本节内容:
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源码关联延伸阅读的更多相关文章
- Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码)
Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合(注解及源码) 备注: 之前在Spring3 + Spring MVC+ Mybatis 3+Mysql 项目整合中 ...
- 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)
目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- Spring中AOP相关的API及源码解析
Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...
- Spring Boot核心技术之Rest映射以及源码的分析
Spring Boot核心技术之Rest映射以及源码的分析 该博客主要是Rest映射以及源码的分析,主要是思路的学习.SpringBoot版本:2.4.9 环境的搭建 主要分两部分: Index.ht ...
- (转)把hadoop源码关联到eclipse工程
把hadoop源码关联到eclipse工程 转:http://www.superwu.cn/2013/08/04/355 在eclipse中阅读源码非常方便,利于我们平时的学习,下面讲述如何把 ...
- Junit 3.8源码分析
JUnit背景介绍 JUnit是由Erich Gamma和Kent Beck 编写的一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓的白 ...
- SpringBoot 整合 spring security oauth2 jwt完整示例 附源码
废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...
- 快速开发架构Spring Boot 从入门到精通 附源码
导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...
随机推荐
- 浅谈arguments属性callee
1.首先 arguments 是一个对应于传递给函数的参数的类数组对象 2. arguments.callee 属性包含当前正在执行的函数. 描述 callee 是 arguments 对象的一个属性 ...
- Java 将Map按Value值降序排列
1 /** 2 * 将集合按照降序排列-FLOAT 3 * @param nowPartTwoData 4 * @return 5 */ 6 private static List<Map.En ...
- 使用flex的同时设置超出喜爱是省略号,
超出宽度,显示省略号 overflow:hidden; white-space:nowrap; text-overflow:ellipsis; 需要注意的是,在移动端在flex元素中的内容进行省略文字 ...
- 【Python打包成exe方法】——已解决导入第三方包无法打包的问题
前言 在我们写代码的过程中,我们开发的脚本一般都会用到一些第三方包,可能别人也需要用到我们的脚本,如果我们将我们的xx.py文件发给他,他是不能直接用的,他还需要安装python解释器,甚至还要安 ...
- C++---使用类
运算符重载 概念 运算符重载就是想法转换, 目的是简化函数调用的方式 重载就是赋予新的含义, 运算符重载也是, 即同一个运算符可以有不同的功能 C++本身已经对一些运算符进行了重载, 同时C++允许程 ...
- Pinpoint介绍及docker安装方式
一.介绍 Pinpoint是用Java编写的大型分布式系统的APM(Application Performance Management应用程序性能管理)工具,受Dapper论文的启发,Pinpoin ...
- Vue 中 axios 跨域配置 (!!!配置完成需要重新运行,不然也不起作用)
当拿到一个网址如:https://music.163.com/store/api/categorypage/list 获取数据是出现如下: 证明该网址不能非常直观的拿到数据.接下来我们试试跨域拿这个 ...
- jq大体架构。先记录再慢慢剖析
//工具方法 Utilities //回调函数列表 Callbacks Object //异步队列 Deferred Object //浏览器功能测试 Support //数据缓存 Data //队列 ...
- oracle提交后再回滚解决办法
BEGIN; 刚才改错数据,直接commit了,rollback了下,没效果,经过google,oracle有个 闪回 功能,经测试,可用. -- 查询闪回id 如:06001B00054E0000 ...
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
本篇关键词:指令格式.条件域.类型域.操作域.数据指令.访存指令.跳转指令.SVC(软件中断) 内核汇编相关篇为: v74.01 鸿蒙内核源码分析(编码方式) | 机器指令是如何编码的 v75.03 ...