JUnit4运行过程中,org.junit.runner.notification. RunListener和RunNotifier运用了观察者模式

1.观察者

观察者Observer/Listener主要作用是分析各种事件并定义对应的回调接口

比如JDK中MouseListener处理鼠标键相关的5个动作:鼠标键被按下/pressed、释放/released、单击/clicked、光标进入或离开某组件/enters or exits。java.awt.event .MouseListener的源码:

public interface MouseListener extendsEventListener {

publicvoid mouseClicked(MouseEvent e);

publicvoid mousePressed(MouseEvent e);

publicvoid mouseReleased(MouseEvent e);

publicvoid mouseEntered(MouseEvent e);

publicvoid mouseExited(MouseEvent e);

}

那么。RunListener处理測试执行的7个动作

1. publicvoid testRunStarted(Description description)

在全部測试将要执行前的动作。如同运动会比赛前召开开幕式一样。

2. public void testStarted(Description description)

在一个測试(如@Test)開始之前的动作。

3. public void testFinished(Description description)

相应testStarted。一个測试结束后的动作。不论測试succeeds or fails。

4.public void testRunFinished(Result
result)

相应testRunStarted,全部測试执行后的动作。

5.public void testIgnored(Description description)

遇到一个@Ignore測试方法是的动作。

6. public void testFailure(Failure
failure)

若測试失败。调用这个动作。

7. public void testAssumptionFailure(Failure failure)

与断言不同,Assume定义了4个静态的測试条件,如assumeTrue(boolean b)等。

假设条件不满足时调用本方法。

RunListener定义了这7个空方法,地位等同于MouseAdapter,yqj2065认为不妨用abstract修饰它。

注意:回调接口的參数,用于将数据传递给上层模块。因为7个动作发生的时机不同,RunListener中使用了Description、Failure和Result封装回调接口所需的数据。

org.junit.runner.notification.Failure封装的数据有:final Description、final Throwable。

Result封装的数据有:

privateAtomicInteger fCount // the number of tests run

privateAtomicInteger fIgnoreCount// the number of tests ignored

privatefinal List<Failure> fFailures

privatelong fRunTime// milliseconds for run the entire suite

privatelong fStartTime;

Result有一些get方法,还提供了几个便利方法如

public booleanwasSuccessful() //fFailures .size()为0f返回true

另一个自带的私有内部类Listener,用于产生Result封装的数据。比如

public voidtestFinished(Description description) throws Exception {

fCount.getAndIncrement();

}

把这个代码放在testStarted中也能够。

(能够删除这些类型)

2. TextListener

详细监听器org.junit.internal.TextListener将以打印文本的形式处理7种动作。

正如我们经常使用的System.out.println()。TextListener的打印工作由一个java.io.PrintStream完毕,而该对象由System或JUnitSystem指定。顺便说明接口JUnitSystem有两个方法:exit(int i)和PrintStream out();其子类RealSystem代码

public class RealSystem implements JUnitSystem {

publicvoid exit(int code) {   System.exit(code);  }

publicPrintStream out() {            returnSystem.out;  }

}

TextListener为编写我们自己的Listener提供了一个简单的样例。(能够删除这些类型)

3. RunNotifier

被观察目标Subject/Notifier,某种事件发生或数据/状态改变后,自己主动调用doNotify()转而调用回调。RunNotifier是一个半截子的Subject,它维护一个注冊表List<RunListener>。有addListener、removeListener操作;可是它的7个fireXxx方法触发对回调接口的调用,不涉及某种事件发生或数据/状态改变。

这就是典型的二传手式委派

真正的幕后的Subject是谁呢?

因此这个二传手是一个孤零零的类,没有子类,全部public方法都在凝视中声称为Internaluse only。

本文涉及的类型:org.junit.runner.notification.RunListener及其子类org.junit.internal.TextListener(JUnitSystem和RealSystem)、数据Description、Failure和Result、RunNotifier

涉及的设计模式:观察者模式。

JUnit4.8.2源码分析-4 RunNotifier与RunListener的更多相关文章

  1. JUnit4.8.2源码分析-1 说明

    阅读本系列文章时须要知道的: JUnit是由GOF 之中的一个的Erich Gamma和 Kent Beck 编写的一个开源的单元測试框架,分析JUnit源码的主要目的是学习当中对设计模式的运用.JU ...

  2. 【JUnit4.10源码分析】6.1 排序和过滤

    abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUn ...

  3. 【JUnit4.10源码分析】5 Statement

    假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...

  4. JUnit4.12 源码分析之TestClass

    1. TestClass // 源码:org.junit.runners.model.TestClass // 该方法主要提供方法校验和注解搜索 public class TestClass impl ...

  5. JUnit源码分析 - 扩展 - 自定义Rule

    JUnit Rule简述 Rule是JUnit 4.7之后新加入的特性,有点类似于拦截器,可以在测试类或测试方法执行前后添加额外的处理,本质上是对@BeforeClass, @AfterClass, ...

  6. JUnit源码分析 - 扩展 - 自定义RunListener

    RunListener简述 JUnit4中的RunListener类用来监听测试执行的各个阶段,由RunNotifier通知测试去运行.RunListener与RunNotifier之间的协作应用的是 ...

  7. 【异常及源码分析】org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping

    一.异常出现的场景 1)异常出现的SQL @Select("SELECT\n" + " id,discount_type ,min_charge, ${cardFee} ...

  8. Junit 3.8.1 源码分析(一)

    写在前面:本文基于Junit3.8.1版本,因为这是我第一次进行源码学习,先从简单的源码开始学起 1. 示例代码 1.1 准备工作 下载Junit3.8.1的JAR包 需要下载junit-3.8.1- ...

  9. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

随机推荐

  1. hdu 5031 Lines 爆搜

    事实上嘞,这个线能够仅仅延伸一端 然后嘞,爆搜一次就能够 最后嘞,600-800ms过 本弱就是弱啊.你来打我呀-- #include<iostream> #include<cstr ...

  2. Swift - 分页菜单的实现(使用PagingMenuController库实现tab标签切换)

    分页菜单(分段菜单)在许多 App 上都会用到.比如大多数新闻 App,如网易新闻.今日头条等,顶部都有个导航菜单.这个导航菜单是一组标签的集合,每个标签表示一个新闻类别,我们点击这个标签后下面就会切 ...

  3. ROS-SLAM-自主导航

    前言:无. 前提:已下载并编译了相关功能包集,如还未下载,可通过git下载:https://github.com/huchunxu/ros_exploring.git 一.启动仿真环境 cd ~/ca ...

  4. Spark SQL概念学习系列之分布式SQL引擎

    不多说,直接上干货! parkSQL作为分布式查询引擎:两种方式 除了在Spark程序里使用Spark SQL,我们也可以把Spark SQL当作一个分布式查询引擎来使用,有以下两种使用方式: 1.T ...

  5. 七牛上图片总是net::ERR_NAME_NOT_RESOLVED

    七牛上图片总是net::ERR_NAME_NOT_RESOLVED >> php这个答案描述的挺清楚的:http://www.goodpm.net/postreply/php/101000 ...

  6. 哪里获取ZBrush简体中文版?

    ZBrush®精简版(ZBrush简体中文版)ZBrushCore发布已经有一段日子了,相信不少人早已迫不及待地开始尝试了,不知道你们的体验如何?毋庸置疑的是,ZBrushCore专为刚接触3D并希望 ...

  7. “双十二”年终盛典,Guitar Pro邀您一起倾情共舞

    躲过了双十一,躲不过双十二,隐约昨天还是双十一,马上双十二又叕来了,弱弱的问一句“你们的手长粗了来了吗?”在这即将结束的年终盛典里,各商家又将如“双十一”般纷纷使出浑身解数,作为吉他最佳拍档的编曲软件 ...

  8. (转)JobTracker和TaskTracker概述

    一 概述: (1)Hadoop MapReduce采用Master/Slave结构. *Master:是整个集群的唯一的全局管理者,功能包括:作业管理.状态监控和任务调度等,即MapReduce中的J ...

  9. NuSOAP笔记:如何创建复杂数据类型

    PHP已经有了内置的SOAP扩展,但是它不具备自动生成WSDL的能力,所以很多时候,NuSOAP还是有一定诱惑力的. 在应用稍微复杂点的时候,单靠integer, string等简单数据类型是不能满足 ...

  10. 新手学python-Day3-模块

    模块就是引入别人写的,官方写的工具库,就像扳手,钳子,电锯