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团队提供的全新框架,其设计 ...
随机推荐
- 所有用CSS3写的3D特效,都离不开这些知识
起因 昨晚在做慕课网的十天精通CSS3课程,其中的综合练习是要做一个3D导航翻转的效果.非常高大上. 以往这些效果我都很不屑,觉得网上一大堆这些特效的代码,复制粘贴就好了,够快.但是现实工作中,其实自 ...
- 记一次用mpvue框架搭建的小程序
介绍 mpvue (github 地址请参见)是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了Vue.js 的 runtime 和 compiler 实 ...
- 时间篇之centos7修复ntpq: read: Connection refused
关于ntp同步时间, 由于是解决问题,所以理论性内容不多. 关于UTC NTP要提供准确的时间,就必须有准确的时间来源,那可以用格林尼治时间吗?答案是否定的. 因为格林尼治时间是以地球自转为基础的时间 ...
- 安装mysql ndb cluster二进制版本在linux上
Installing an NDB Cluster Binary Release on Linux (官方安装手册)手册地址:https://dev.mysql.com/doc/refman/5.7/ ...
- 帝国CMS随机调用栏目
[e:loop={'select * from [!db.pre!]enewsclass where bclassid in(1) order by rand() desc limit 10',10, ...
- hashlib加密模块、logging日志模块
hashlib模块 加密:将明文数据通过一系列算法变成密文数据 目的: 就是为了数据的安全 基本使用 基本使用 import hashlib # 1.先确定算法类型(md5普遍使用) md5 = ha ...
- linux原生命令行看上面的内容
上一页:Shift+pageUp 下一页:Shift+pageDown
- php进制转换
前端html页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- css 第二排文字居中
text-align: center; 超过长度 自动换行居中
- 前端vue之属性指令、style和class、条件渲染、列表渲染、事件处理、数据双向绑定、表单控制、v-model进阶
今日内容概要 属性指令 style和class 条件渲染 列表渲染 事件处理 数据的双向绑定 v-model进阶 购物车案例 内容详细 1.属性指令 <!DOCTYPE html> < ...