JUnit4.8.2来源分析-2 org.junit.runner.Request
JUnit4.8.2源代码,最为yqj2065兴趣是org.junit.runner.Request,现在是几点意味着它?
①封装JUnit的输入
JUnit4作为信息处理单元,它的输入是单元測试类——布满各种JUnit4的RUNTIME标注的类,但因为使用反射机制,JUnit4的输入严格地说是一个或多个(组)单元測试类的Class对象。早期版本号的JUnit主要处理一个測试或測试构成的树,在增添了对过滤/
filtering和排序/ sorting支持后,JUnit4增加了这个概念。毕竟依照1.2.4 Java Annotation 提要的直接使用反射机制方式。代码会非常复杂。
②知子莫若父??
面向对象中。一般父类不知其子类。然而在这里我们看见了反例。
BlueJ中生成的JavaDoc
父类何时应该知道子类?这是一个问题,我仅仅记得在WCF中遇到过数据契约中有个KnownType的东西。Request源码中import其各个子类,并在一系列静态方法中使用它们而返回Request对象。Request是一个抽象类,通过静态方法返回Request(的子类) 的对象,这究竟得和new有多大的仇恨啊。只是我喜欢。
这些静态方法我不称其为静态工厂
public static Request aClass(Class<?
> clazz)
public static Request classWithoutSuiteMethod(Class<?> clazz)
public static Request classes(Computer computer, Class<?>... classes)
public static Request classes(Class<?>...classes)
public static Request runner(final Runner runner)
public static Request method(Class<?> clazz, String methodName) {
Description method= Description.createTestDescription(clazz,methodName);
return Request.aClass(clazz).filterWith(method);
}
Request.method()将一个@Test封装为Request,毕竟@Test是基础。【HelloWorld 的单元測试类TestInJUnit4见源码分析-1】
例程 8-3測试Request类
package myTest;
import org.junit.runner.*;
public class RequestDemo{
public static void test()throws Exception{
Request rqst = Request.method(TestInJUnit4.class,"add");
Result r = new JUnitCore().run(rqst);
System.out.println(r.wasSuccessful() );
}
}
③Request运用了工厂方法模式。
Request有一个工厂方法:public abstractRunner getRunner();
并且Request的设计有一个奇异的地方:在创建对象的时候似乎使用装饰模式?Request为装饰模式中的Component、org.junit.internal.request.ClassRequest为详细组件,而FilterRequest和SortingRequest为详细装饰者(没有抽象Decorator)。而这一切,目的却是为了构建Request相关的Runner。
④Request使用set串接模式
Request的其它非静态方法filterWith、sortWith能够视为set方法。
Request.method()中给出了样例:
return Request.aClass(clazz).filterWith(method);
本文涉及的类型:Request及其3个子类,Description;涉及的设计模式:工厂方法模式、set串接模式、装饰模式。
相关的类型:Runner、AllDefaultPossibilitiesBuilder、Filter等一下。
版权声明:本文博主原创文章,博客,未经同意不得转载。
JUnit4.8.2来源分析-2 org.junit.runner.Request的更多相关文章
- JUnit org.junit.runner.Request.classWithoutSuiteMethod解决方法
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- JUnit4.8.2来源分析-6.1 排序和过滤
Runner.sort.Request.sortWith和Sorter.apply yqj2065很快,他们搞死. Sorter.apply().Request.sortWith()和Sortable ...
- 【JUnit4.10源码分析】3.4 Description与測试树
Description使用组合模式描写叙述一个測试树.组合模式中全部元素都是Composite对象. Description有成员变量private final ArrayList<Descri ...
- 【JUnit4.10来源分析】6 Runner
org.junit.runner.Runner它是JUnit作业引擎.它在许多类型的支持下的.处理试验和生产(Description).Failure和Result和其它输出. Runner参见图主类 ...
- 【JUnit4.10源码分析】6.1 排序和过滤
abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUn ...
- 【JUnit4.10源码分析】5.2 Rule
标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Descr ...
- 1.Android JUnit Runner(使用AndroidStudio)
一.Android JUnit Runner介绍 1.Android JUnit Runner 1)是一个测试运行器,用于运行Junit3和Junit4的Android测试包 2)替换Instrume ...
- java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
今天想写个随笔,最近经常遇到使用junit的时候报java.lang.NoClassDefFoundError,今天算是恍然大悟了,原来junit虽然在gradle里面配置了,也在Project an ...
- Java-Class-@I:org.junit.runner.RunWith
ylbtech-Java-Class-@I:org.junit.runner.RunWith 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 1. package org.juni ...
随机推荐
- MySql之ALTER命令用法详细解读(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文详细解读了MySql语法中Alter命令的用法,这是一个用法比较多的语法,而且功能还是很强 ...
- mapreduce程序来实现分类
文件的内容例如以下所看到的: 5 45 8 876 6 45 要求最后的输出格式: 1 5 2 6 3 8 4 45 5 45 5 876 首先,这个题目是须要对文 ...
- WPF 绑定
WPF里分三种Binding:Binding, PriorityBinding, MultiBinding,这三种Binding的基类都是BindingBase,而BindingBase又继承于Mar ...
- redmine忘记username和password
环境: Ubuntu 13.10 bitnami-redmine-2.5.1-1-linux-x64-installer.run 用bitnami安装完redmine以后,有是否忘记了username ...
- 使用dfs实现1至n全阵列
使用dfs实现1至n全阵列. 我的方法是从所述第一位置开始,使用dfs看上去就像每个头号位置, 当某个位置.从小到大枚举1至n所有号码,打假说 尚未使用之前在这个位置上的几个选择这个号码.然后搜索下 ...
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- C++结构体之统计最高最低分
[Submit][Status][Web Board] Description 输入学生的姓名和成绩,统计出最高分的学生和最低分的学生. Input 输入5个学生的姓名和分数,用结构体完成 Outpu ...
- iOS 辛格尔顿
单例模式: 为什么使用单例,单例模式的用途是什么?以下我们举一个样例来诠释一下 举个大家都熟知的样例--Windows任务管理器,如图,我们能够做一个这种尝试,在Windows的"任务栏&q ...
- 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案
内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...
- cassandra 服务启动流程
cassandra 服务启动流程 1. setup 1) CassandraDaemon ->main publicstaticvoidmain(String[]args) { insta ...