1. TestClass

// 源码:org.junit.runners.model.TestClass
// 该方法主要提供方法校验和注解搜索
public class TestClass implements Annotatable{
private static final FieldComparator FIELD_COMPARATOR = new FieldComparator();
private static final MethodComparator METHOD_COMPARATOR = new MethodComparator(); // 三个成员变量
private final Class<?> clazz;
private final Map<Class<? extends Annotation>, List<FrameworkMethod>> methodsForAnnotations;
private final Map<Class<? extends Annotation>, List<FrameworkField>> fieldsForAnnotations; // 由于JDK对标注的处理代价高昂,此处,构造器的作用是为了保证实例的共用
public TestClass(Class<?> clazz){
this.clazz = clazz;
if(clazz != null && clazz.getConstructors().length > 1){
throw new IllegalArgumentException(
"Test class can only have one constructor");
} Map<Class<? extends Annotation>, List<FrameworkMethod>> methodsForAnnotations =
new LinkedHashMap<Class<? extends Annotation>, List<FrameworkMehod>>();
Map<Class<? extends Annotation>, List<FrameworkField>> fieldsForAnnotations =
new LinkedHashMap<Class<? extends Annotation>, List<FrameworkField>>(); scanAnnotatedMembers(methodsForAnnotations, fieldsForAnnotations); this.methodsForAnnotations = makeDeeplyUnmodifiable(methodsForAnnotations);
this.fieldsForAnnotations = makeDeeplyUnmodifiable(fieldsForAnnotations);
} ...(略)
} // 测试代码
public class TestUnit(){
public TestUnit(){} @Test
public void addx(int x){
assertEquals(5, 1+x);
} @Test
public void add(){
assertEquals(5.0, 4.0, 0.1);
} @Test
public void hello(){
assertEquals(5.0, 4.0, 0.1);
}
} public class TestClassDemo{ public static void main(String[] args) throws Throwable{
TestClass kclass = new TestClass(TestUnit.class);
System.out.println(kclass.getName()); // Test.class 就是类中标明 @Test 注解的方法
List<FrameworkMethod> list = kclass.getAnnotatedMethods(Test.class);
for(FrameworkMethod fm : list){
try{
fm.invokeExplosively((TestUnit)kclass.getJavaClass().newInstance(), new Object[0]);
}catch(Throwable e){
System.out.println(e);
}finally{
System.out.println(fm.getName() + " invoked!");
}
}
}
}

参考资料:

JUnit4.12 源码分析之TestClass的更多相关文章

  1. JUnit4.12 源码分析之Statement

    1. Statement 抽象类Statement作为命令模式的Command,只有一个方法 各种Runner作为命令模式中的Invoker,将发出各种Statement,来表示它们运行JUnit测试 ...

  2. JUnit4.12 源码分析(二)之TestRule

    1. TestRule TestRule和@Before,@After,@BeforeClass,@AfterClass功能类似,但是更加强大; JUnit 识别TestRule的两种方式: 方法级别 ...

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

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

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

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

  5. 12.源码分析—如何为SOFARPC写一个序列化?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  6. 【JUnit4.10源码分析】3.4 Description与測试树

    Description使用组合模式描写叙述一个測试树.组合模式中全部元素都是Composite对象. Description有成员变量private final ArrayList<Descri ...

  7. 【JUnit4.10源码分析】5.2 Rule

    标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Descr ...

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

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

  9. Solr4.8.0源码分析(12)之Lucene的索引文件(5)

    Solr4.8.0源码分析(12)之Lucene的索引文件(5) 1. 存储域数据文件(.fdt和.fdx) Solr4.8.0里面使用的fdt和fdx的格式是lucene4.1的.为了提升压缩比,S ...

随机推荐

  1. 在windows中使用Navicat连接Linux虚拟机中的mysql数据库

    今天想用navicat远程连接虚拟机中的MySQL数据库,一直连不上,在网上搜索了一下,发现原因是MySQL对远程用户登陆的授权问题.这里说一下我的解决方法.(本人小白) 首先,我用navicat去远 ...

  2. DevExpress v15.2新功能介绍视频(25集全)

    DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...

  3. org.apache.hadoop.hbase.DoNotRetryIOException: Class org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be loaded Set hbase.table.sanity.checks to false at conf or table descriptor if you want

    https://stackoverflow.com/questions/38495331/apache-phoenix-unable-to-connect-to-hbase 这个坑不该啊 首选配置hb ...

  4. C++按行读取和写入文件

    按行读取: 假设有一个文本文件,如下所示: 1 2 32 3 43 4 55 6 77 8 9 文件名为split.txt 目的:按照行读取数据,并一个个的显示出来. 代码如下: #include & ...

  5. Update 语句用于修改表中的数据。

    语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

  6. (转)android从应用到驱动之—camera(1)---程序调用流程

    一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...

  7. iScroll框架解析——Android 设备页面内 div(容器,非页面)overflow:scroll; 失效解决(转)

    移动平台的活,兼容问题超多,今儿又遇到一个.客户要求在弹出层容器内显示内容,但内容条数过多,容器显示滚动条.按说是So easy,容器设死宽.高,CSS加属性 overflow:scroll; -we ...

  8. php7垃圾回收分析

  9. mysql触发器小实验

    今天实验了一下mysql的触发器 mysql> use test; Database changed mysql> desc time; +-------+---------------- ...

  10. cocos lua 加密方案

    cocos2d使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以直接用luac法编译出来的bytecode脚本无法在cocos2d中使用. 目前所指的解决方案有2 ...