阅读前提

代码版本: junit 4.12
代码搜索工具: http://grepcode.com/
常用符号

  • _: 用来略去代码段中无关紧要的parameter

  • ...: 用来略去无关紧要的代码实现

本文的展开方式:连续提出问题,通过阅读JUnit源代码回答。

剧透

如果您看了[深入JUnit] @Before, @After, @Test的秘密], 里面的BlockJUnit4ClassRunner是通过本文涉及到的,一个叫AllDefaultPossibilitiesBuilder的类,与JUnitCore连接到一起的。JUnitCore是今天的主角!

Q&A

Q1: 比如说我们有一个SampleTest类,如何调用JUnit来运行测试?
A: JUnit有一个JUnitCode的类,他的描述是

JUnitCore is a facade for running tests.

所以,这个是运行测试的一个入口。Facade模式就是把错综复杂的子模块隐藏起来,暴露几个简单的API给用户使用。

source code:
http://grepcode.com/file/repo1.maven.org...

Q2: 哪该使用JUnitCore的那个函数?
A: 瞄一眼JUnitCore,有一个main函数。大喜

public static void main(String... args) {
Result result = new JUnitCore().runMain(new RealSystem(), args);
System.exit(result.wasSuccessful() ? 0 : 1);
}

Q3: JUnitCore#runMain内部有什么有意思的要看的东西?
A: JUnitCore#runMain最终落脚到org.junit.runner.Runner#run这个函数。runner是如何决定的?请看org.junit.internal.builders.AllDefaultPossibilitiesBuilder内部。
http://grepcode.com/file/repo1.maven.org...

Q4: JUnitCore这个类有什么瑕疵么?
A: 这个类所有的methods都是public的,有好几个method的生命让人感觉很费解。作为一个facade类,应该提供尽可能少的,封装良好的方法。但JUnit提供了8个run**的方法,其中runMainrunClasses(Computer, classes)runRequest都应该是protected(package private),因为其中泄露了很多子系统的model概念,例如Request, Computer之类。

Summary

  • JUnitCore是一个facade类,他提供了几个测试入口::main, runClass啥的。

  • AllDefaultPossibilitiesBuilder这个类存了几个默认的Test Runner。常用的BlockJUnit4ClassRunner就在其中

References

下期内容

泛泛地了解了JUnit的code path,暂时没兴趣继续深挖了。
接下来,打算转战倡导Mockito。Mockito::mock, Mockito::doReturn这些函数我觉得挺神奇的。

[深入JUnit] 测试运行的入口的更多相关文章

  1. junit 测试套件Suite

    junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...

  2. JUnit扩展:引入新注解Annotation

    发现问题 JUnit提供了Test Suite来帮助我们组织case,还提供了Category来帮助我们来给建立大的Test Set,比如BAT,MAT, Full Testing. 那么什么情况下, ...

  3. junit源码解析--初始化阶段

    OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...

  4. Junit 测试集(打包测试)实例

    测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...

  5. JUnit4源码学习笔记

    先上一个在Spring-test下运行的调用栈 自底向上: JUnitStarter IDEA对JUnit的支持,调用JUnitCore.run(Runner),将注解@RunWith指定的Runne ...

  6. SSH的Eclips环境搭建

    一.创建数据库名字为:dungouoa create database dungouoa default character set utf8; mysql> show create datab ...

  7. 【SSH框架】之Hibernate系列一

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.Hibernate框架概述 (1).什么是HibernateHibernate是一个开放源代 ...

  8. UiAutomator1.0 与 UiAutomator2.0

      在使用2.0之前,对android自动化框架也做过一些了解<Android 自动化测试框架>.使用UiAutomator2.0也有一段时间,这里将1.0与2.0进行一个对比总结. Ui ...

  9. Ping++支付

    第一次接触支付啊,有点小激动,所以写下这篇随笔以防以后忘记. ping++的文档还有服务都是挺好的,当你注册之后,就会给你发邮件.截图如下: 是不是感觉服务很不错. 接下来直入正题. 首先,我们需要加 ...

随机推荐

  1. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  2. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  3. Linux 添加新磁盘,在线扩充空间

    CentOS 7开发环境中的home 目录空间满了,需要增加空间 到虚拟机上执行"ls /sys/class/scsi_host",然后重新扫描SCSI总线来添加设备.如右图.然后 ...

  4. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  5. 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇

    最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...

  6. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...

  7. 2003-Can't connect to mysql server on localhost (10061)

    mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...

  8. 2-1 Linux 操作系统及常用命令

    根据马哥linux初级视频 2-1.2-2来编辑 1. GUI与CLI GUI: Graphic User Interface CLI: Command Line Interface 注:在Windo ...

  9. 腾讯云上免费部署HTTPS

    接上篇<腾讯云下安装 nodejs + 实现 Nginx 反向代理>,想从头一步到位的同学建议从上篇文章开始阅读.本文将继续介绍如何通过 Nginx 免费部署HTTPS. 留意下,这里的“ ...

  10. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...