JUnit 3.8.1 源码学习
JUnit 3.8.1 源码学习
环境搭建(源码加载配置)
由于IDE自身含有JUint插件,因此通过正常途径是没有源码加载入口的,因此需通过手动加载扩展JAR,然后再添加对应源码JAR,如图:项目右键—>Propreties
完成之后,项目结构如图:
启动类创建
为了能够对JUint的整个流程有个完整的认识,通过一个简单的调用作为入口,走进JUint的大门。在这里通过一段非常简单的代码,如下
public class Caculator {
int a,b;
public Caculator(int a, int b) {
super();
this.a = a;
this.b = b;
}
public static int add(int a, int b) {
return a+b;
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
junit.textui.TestRunner.run(TestCaculator.class);
}
}
public class TestCaculator extends TestCase{
public void testadd() {
int result = Caculator.add(1,2);
Assert.assertEquals(4, result);
}
}
这里通过代码启动,junit.textui.TestRunner.run(TestCaculator.class);
正式开始
首先看到的是TestSuite(Test子类),通过调用TestSuite的有参构造器

有参构造中,最主要的就是addTestMethod方法,该方法执行条件是:测试类中有多少个方法就执行多少次,并支持测试类继承

在方法内部,再对方法进行规则校验

包括对方法的参数个数、方法名称、方法返回值以及方法修饰符


同时也注意到,不管校验是否通过,都会调用addTest方法(这里用到了组合模式),添加的Test对象在执行测试类时进行遍历获取
该方法接收一个Test接口类型的参数
先说校验不通过的处理逻辑,在warning方法体内,通过匿名内部类的方式生成TestCase类,并重写runTest方法,其中的fail方法,则是throw一个自定义error异常信息

再说校验通过所调用的createTest方法,该方法主体是通过反射生成TestCase对象实例,同时将字段名称赋值给TestCase对象的fName字段(该用于日志输出)

到此,测试类已经加载完毕,接下来就是启动测试类
对于测试结果,通过TestResult类进行接收,通过createTestResult方法new出一个TestResult实例对象,再调用其addListener方法添加监听(这里使用到了观察者模式)
通过调用Test.run方法进行测试类的启动,这里的suite的实际类型为TestSuite类型

调用tests方法获取加载测试类时所添加的测试类对象,遍历执行每个测试类的run方法
执行到TestCase的run方法,方法接收一个TestResult类型的参数,方法体内,再执行该TestResult对象的run方法

在TestResult类中的run方法体内,调用了三个方法,其中最重要的就是Protectable这个接口的内部类实现,它的protect方法体中的TestCase.runBare()方法中的runTest方法是最终的测试方法的执行


startTest方法,用来执行Listener(观察者)实际类型为ResultPrinter的startTest方法,控制台则输出对应的"."信息


通过反射执行测试类中指定的测试方法,方法体重的fName字段的参数,在通过反射生成对象实例时,调用set方法进行赋值了,如在测试方法执行过程中,产生的异常,则会向上抛出

p.protect是执行测试方法的最后一步,如执行测试方法有异常,在runProtected方法体中,进行catch捕获,并调用对应的addFailure或addError方法

记录失败信息,fFailures用来存储产生的错误信息日志数据,用来执行Listener(观察者)实际类型为ResultPrinter的addFailure方法输出对应的错误信息

至此,启动测试类已经运行完毕,接下来就是输出运行结果
调用fPrinter.print方法实现日志的输出
在方法体中的四个方法,就是最终日志的输出方法
printFailures实现代码如下,获取在执行测试类记录的错误日志,并输出


JUnit 3.8.1 源码学习的更多相关文章
- JUnit 3.8.1 源码学习简记
先记录一个整理的流程 1.首先使用TestSuite获取一个TestCase中的所有测试方法(方法名以test开头的方法),为每个方法生成一个TestCase实例并保存,实例中有个字段保存对应的方法名 ...
- Junit 3.8.1 源码分析(一)
写在前面:本文基于Junit3.8.1版本,因为这是我第一次进行源码学习,先从简单的源码开始学起 1. 示例代码 1.1 准备工作 下载Junit3.8.1的JAR包 需要下载junit-3.8.1- ...
- Tomcat源码学习
Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...
- spring源码学习——spring整体架构和设计理念
Spring是在Rod Johnson的<Expert One-On-One J2EE Development and Design >的基础上衍生而来的.主要目的是通过使用基本的java ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
随机推荐
- 云计算——Google App Eng…
云计算--Google App Engine(一) 编者:王尚 2014.04.12 20:20 介绍:Google App Engine提供一套开发组件让用户轻松的在本地构建和调试网络应用,之后能让 ...
- How to create a jump server in AWS VPC
本来是写的Word文档,给其他国家的同时看的,所以一开始就是英文写的,也没打算翻译成为中文了,顺便抱怨下,网上资料找了很久的资料都没有看到介绍怎么在单机环境下搭建RD Gateway的,写本文的目的是 ...
- Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换
总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...
- java类的继承,多态,抽象类与接口
知识点梳理: 1,怎样定义自己的类. MyStarFrame,MyStarPanel 类中定义: (1)属性(数据),变量. (2)方法(函数),行为. (3)构造方法(特征,作用,何时被调用 ...
- java变量、二进制、数据类型、原码、补码、反码
1. 变量 1. 他 她 我 你 某人 佚名 旺财 X-man x = 1 您好! 它 (变量就是自然语言中的代词) 2. int age = 15;// 00000000 0000 ...
- [NOIP 2010]饮水入城 搜索+贪心
考试的时候写了个dfs找出来了,最后处理的时候想到了贪心,但是正确性没有想通.然后想了想动规,也没想通.最后没办法,用状态的话用了个状压,弄了40分. 正解是bfs+贪心.Dfs也有过的. 下面题解引 ...
- ASP.NET Core 运行原理解剖[1]:Hosting
ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...
- 原创:Docker在云家政的应用 谢绝复制粘贴内容
我们公司目前大规模使用了Docker,目前除了数据库应用,其他所有应用都在Docker容器内运行,下面我就Docker在公司的应用做一些分享.. 首先我介绍一下公司的背景,公司属于中小型创业公司,服务 ...
- 【Centos】系统服务自启动配置
Centos使用chkconfig命令来更新(启动或停止)和查询系统服务的运行级信息. 谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfi ...
- Java 垃圾回收机制(早期版本)
Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但 ...





