`
中国爪哇程序员
  • 浏览: 165507 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Junit 源码解析(一)

阅读更多
Junit 源码解析(一)之junit运行容器

package org.junit.runner;
public abstract class Runner implements Describable
Runner是JUNIT的运行容器,它是各种Junit运行容器的父类。我们可以把它理解成web容器,spring容器,就是单元测试类所在运行环境。
我们在跑单元测试时,单元测试用例的生命周期就是由runner来控制的。这和其他容器一样。

首先是选择容器,在跑单元测试时,最先构建的是Runner容器。源代码如下:
见AllDefaultPossibilitiesBuilder下的public Runner runnerForClass(Class<?> testClass) throws Throwable
	@Override
	public Runner runnerForClass(Class<?> testClass) throws Throwable {
		List<RunnerBuilder> builders= Arrays.asList(
				ignoredBuilder(),
				annotatedBuilder(),
				suiteMethodBuilder(),
				junit3Builder(),
				junit4Builder());

		for (RunnerBuilder each : builders) {
			Runner runner= each.safeRunnerForClass(testClass);
			if (runner != null)
				return runner;
		}
		return null;
	}


builders是容器的创建者,它是一个list,创建ignoredBuilder(),annotatedBuilder(),suiteMethodBuilder(),junit3Builder(),junit4Builder());
遍历builders,因为list是有序的,当某一个junit容器创建成功,则跳出循环,不再创建其他容器。而创建好的Runner容器就负责执行单元测试用例。

下面说一下各个容器的作用和特点

(1)IgnoredBuilder,
	public Runner runnerForClass(Class<?> testClass) {
		if (testClass.getAnnotation(Ignore.class) != null)
			return new IgnoredClassRunner(testClass);
		return null;
	}

当在你的单元测试类前面加@Ignore的时候,这个容器就会被创建。这个容器不会执行单元测试方法。
这也就是当我们有些单元测试用例类跑不过时,加类上面加注解@Ignore,通过忽略通过的原因。

(2)AnnotatedBuilder
	@Override
	public Runner runnerForClass(Class<?> testClass) throws Exception {
		RunWith annotation= testClass.getAnnotation(RunWith.class);
		if (annotation != null)
			return buildRunner(annotation.value(), testClass);
		return null;
	}

在JUNIT已经提供了自己的容器,当在生产开发中,如果觉得JUNIT提供的容器已经不能满足需求时,可以自己创建个性化的容器。在类的声名加上注解RunWith,指定你自己创建容器。像在spring中,它提供了自己的单元测试容器。
请见Spring测试的基类AbstractJUnit4SpringContextTests,在它的类注解中加了RunWith,指定它的测试容器SpringJUnit4ClassRunner。
一般情况我们并不会用到这个容器。这里想说明的是JUNIT做为一个框架,它通过AnnotatedBuilder提供了可扩展的接口

(3)SuiteMethodBuilder 略

(4)JUnit3Builder
public class JUnit3Builder extends RunnerBuilder {
	@Override
	public Runner runnerForClass(Class<?> testClass) throws Throwable {
		if (isPre4Test(testClass))
			return new JUnit38ClassRunner(testClass);
		return null;
	}

	boolean isPre4Test(Class<?> testClass) {
		return junit.framework.TestCase.class.isAssignableFrom(testClass);
	}
}

这是Junit的早期版本使用的容器,那时写单元测试类需要继承TestCase,现在我们不用再继承这个类了。为兼容老版本。当你的单元测试用例继承了TestCase这个容器就会被创建。isPre4Test方法判断你所写的测试用例类是否是TestCase的子类。记得好像3.8之后的版还是4.0之后的版就可以不用继承TestCase了。

(5)JUnit4Builder
	@Override
	public Runner runnerForClass(Class<?> testClass) throws Throwable {
		return new BlockJUnit4ClassRunner(testClass);
	}

创建最新的Junit自带的测试容器。这个容器是我们现在最常用的,虽然我们并不了解它,但平常写的测试用例类都是在BlockJUnit4ClassRunner下运行的。由于版本原因,这里的BlockJUnit4ClassRunner是比较新容器。之前版本的容器是JUnit4ClassRunner,现在这个类已经打上@Deprecated注解,不再推荐使用。当然你也可以通过上面提到的RunWith来使用这个容器。

针对现在最常用BlockJUnit4ClassRunner,在下一个章节来看他的源码。
分享到:
评论

相关推荐

    junit源码解析之runner

    junit框架,基于源码分析runner实现原理

    UnitTest-JUnit5:学习单元测试-JUnit 5

    UnitTest-JUnit5 学习单元测试-JUnit 5

    Excel Parameterized JUnit-开源

    使用Excel驱动的数据在JUnit中编写TestNG样式的参数化测试

    Springboot整合SSM框架的实战项目——own_demo源码解析

    该项目集成了MyBatis-Plus、Druid数据源、Junit测试以及Swagger文档,实现了前后端分离的设计模式。项目正在不断完善中,已具备基础功能框架。 文件构成: - Java源文件:11个,包含了核心业务逻辑和控制器代码。 -...

    jdk8-source-code:jdk源码解析

    jdk1.8-source-analysis JDK1.8源码分析引入原始过程中的注意事项JDK1.8对应JDK版本下载: 码:49wi原始码在src目录下以下两个类手动添加的,解决编译过程中该包的丢失sun.font.FontConfigManager sun.awt....

    计算机毕业设计源码,大学生校园运动会活动策划源码设计解析

    # 计算机毕业设计源码,大学生校园运动会活动策划源码设计解析 这份毕业设计源码旨在为计算机专业的毕业生提供一个参考,展示如何进行软件开发并实现功能。该源码是针对大学生校园运动会活动策划而设计的,具有一定...

    zxing.java源码解析-java:Java

    zxing.java源码解析很棒的Java 精选的 Java 框架、库和软件的精选列表。 古人 从一开始就存在,并且在炒作消退后将继续使用很长时间。 - 使用 XML 构建流程管理。 - 在商品硬件集群上存储和大规模处理数据集。 - ...

    Struts+Spring+Hibernate整合详解与典型案例源代码.

    工具详尽:包括JDK、Tomcat、Eclipse、MySQL、Log4j、Ant、JUnit、CVS、解析XML文件等; 由浅入深:每章从简单示例入手,最后给出一个详细示例加深理解; 实战性强:书中提供了大量典型的应用案例,实战性很强; ...

    zxing.java源码解析-Java-Hub:Java-Hub

    zxing.java源码解析Java 中心 Java 框架、库和软件的精选列表。 古人 从一开始就存在,并且在炒作消退后将继续使用很长时间。 - 使用 XML 构建流程管理。 - 在商品硬件集群上存储和大规模处理数据集。 - 用于标记化...

    zxing.java源码解析-awesome-java:真棒Java

    zxing.java源码解析很棒的Java 精选的 Java 框架、库和软件的精选列表。 古人 从一开始就存在,并且在炒作消退后将继续使用很长时间。 - 使用 XML 构建流程管理。 - 在商品硬件集群上存储和大规模处理数据集。 - ...

    zxing.java源码解析-MaterialsJava-1:材料Java-1

    zxing.java源码解析很棒的Java 精选的 Java 框架、库和软件的精选列表。 古人 从一开始就存在,并且在炒作消退后将继续使用很长时间。 - 使用 XML 构建流程管理。 - 在商品硬件集群上存储和大规模处理数据集。 - ...

    zxing.java源码解析-A-curated-list-of-awesome-Java-frameworks-libraries-and-

    zxing.java源码解析很棒的Java 精选的 Java 框架、库和软件的精选列表。 古人 从一开始就存在,并且在炒作消退后将继续使用很长时间。 - 使用 XML 构建流程管理。 - 在商品硬件集群上存储和大规模处理数据集。 - ...

    价值过亿的架构师训练营课面试题和答案.pptx

    框架开发 模式与重构 JUnit、Spring、Hive核心源码解析 第6课 听课总结 系统架构 高并发 高可用 垂直伸缩 水平伸缩 第7课 听课总结 系统架构 大型网站技术架构 维基百科、淘宝、新浪微博案例分析 第8课 听课总结 ...

    android精品源码

    还有很多的例子,见下面的传送门,因为等级问题,一个包放不下,所以分开了。 这个是传送门,如果觉得资源好可以去这里下载更多的例子,以及书藉。都是很不错的!!! 这个是传送门,如果觉得资源好可以去这里...

    详解python单元测试框架unittest

    一:unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。 基本用法如下: 1.用import unittest导入unittest模块 2.定义一个继承自unittest.TestCase的测试用例类,如 class abcd...

    Android基础 布局、数据存储访问、XML系列化解析和SharedPreferences入门

    1、界面布局 主要介绍四种界面布局,常用的是线性布局和相对布局。对于屏幕适配,可以利用线性布局中的...这是Android中另外一种存储文件的形式,文中详细的介绍了序列化和解析的操作步骤。 最最重要的是包含源码

    软件测试 白盒黑盒测试用例 源代码

    1.掌握白盒测试、黑盒测试用例的设计。 2.熟悉使用Junit框架进行基于java语言的单元测试。

    Spring高级之注解驱动开发视频教程

    n 高级特性-自定义PropertySourceFactory实现解析yaml配置文件 n 源码分析-BeanFactory类视图和常用工厂说明 n 源码分析-AnnotationConfigApplicationContext的register方法 n 源码分析-...

    基于SpringBoot、WebSocket、MyBatis实现的在线聊天室平台+源代码+文档说明

    *使用该源码希望能注明原博客以及源码出处,如果觉得还可以的话也可以动动手指点一个star,谢谢!** 一个简易的在线聊天室项目(SpringBoot + MyBatis + WebSocket) ## 二、技术栈 **后端:** - 核心框架:...

Global site tag (gtag.js) - Google Analytics