惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
爱范儿
爱范儿
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
Jina AI
Jina AI
Project Zero
Project Zero
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tenable Blog
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
月光博客
月光博客
雷峰网
雷峰网
G
Google Developers Blog
V
V2EX
T
Tor Project blog
罗磊的独立博客
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
小众软件
小众软件
Scott Helme
Scott Helme
I
Intezer
T
Threat Research - Cisco Blogs
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Latest news
Latest news
AWS News Blog
AWS News Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 外科手术医生

Spring-AI开发之旅 MACD秒解 历史的车轮 添加pdf的目录 spring ai提示词 纳瓦尔宝典-总结内容 小龙虾的skills哪里找? JMeter压测使用 Git仓库ssh不同环境配置 成功没有奇迹,只有积累----Bruce Lee 为什么要⽤ Foundry git命令下,mac环境下载依赖相关报错问题解决方案 数据分析/数据挖掘/机器学习---- 必读书目(转) 简单高效的语言 OSI模型-一图胜千言 dubbo分布式系统 JVM解剖 线程池 集合类 concurrent之CAS concurrent之volatile 架构师之路 责任链设计模式 线程详解 计划自己的时间
Junit框架分析
外科手术医生 · 2021-02-07 · via 博客园 - 外科手术医生

根据项目的启动的,我们有两种方式启动,一种是使用main函数的启动方式,还有一种是@Test启动,main函数的启动,我们是知道如何启动的,因为jvm指令可以执行,编译后mian函数,会创建main线程来执行main函数,并触发JVM的一系列指令执行,把代码run起来。

那@Test注解启动是如何启动的?

我们来看下面这部分代码:

@Test
public void testMethod1() {
    System.out.println("in the testMethod1");
}

进行启动后,debug,截图如下:image.png

发现启动的还是main函数,com.intellij.rt.junit.JUnitStarter#main,只不过这个是插件进行识别进行加载的,源代码idea是看不到的,github可以查看源代码,下面来分析一下@Test框架的启动过程

麻雀虽小,五脏俱全,好好解剖一番

  1. com.intellij.rt.junit.JUnitStarter#main
    1. 下面是开始执行的第一个环节,看到以下代码可以看到每个子方法做的事情很明确,一眼就能看出来要做扫描,代码之前执行动作都是有空行,阅读性很强,方便以后查看及改进image.png
    2. 查看prepareStreamsAndStart方法,这里代码比较优雅的处理类调用方法,不会把需要执行的类,进行方法的传递,而是使用getAgentClass的方法进行解耦image.png
  1. 好了JUnitStarter类相关的执行调用已经结束了,接下到下一站点,JUnit4IdeaTestRunner.startRunnerWithArgs执行,代码比较多,下面就贴一部分java代码, testRunner,获取到@RunWith的执行器image.png
  2. 下面进入核心环节,org.junit.runner.JUnitCore#run(org.junit.runner.Runner),关于RunListener是监听相关,没有添加,就不做解释了,主要是看runner.run(notifier), runner如果没有设置@RunWith的方法,那就会运行自己的JUnit4ClassRunner执行器
    1. image.png
    2. 进入执行器之后,继续查看,在ParentRunner类中的run方法,这边做了junit套件对象的构建及执行image.png
    3. 下面看看套件里面如何执行,如果有beforeClass的注解则构建套件image.png
    4. 下面是具体代码image.pngimage.png 
    5. invokeExploseively就是要执行的代码,执行beforeClass的代码,next游标进行下个类的执行,下面就执行所有@Test进行执行,具体的下面如下,其中MethodInoker我们可以通过覆盖这个类BlockJUnit4ClassRunner的相同的方法,重新构造套件进行执行image.png
    6. 通过该方法获取到相应的注解,执行相应的策略org.junit.runners.model.TestClass#getAnnotatedMethods(java.lang.Class<? extends java.lang.annotation.Annotation>)
  1. 主要核心流程大致分析了一下,细节代码后续再补充

​​