1. Statement

  • 抽象类Statement作为命令模式的Command,只有一个方法
  • 各种Runner作为命令模式中的Invoker,将发出各种Statement,来表示它们运行JUnit测试的整个过程;
  • org.junit.internal.runners.statement包中定义了Statement的子类(具体命令),来处理针对方法

    的标注,如@Test,@Before,@After,@BeforeClass,@AfterClass;
// org.junit.runners.model.Statement
public abstract class Statement{ public abstract void evalute() throws Throwable; } // BlockJUnit4ClassRunner 中的符合命令,来处理 @Test, @Before, @After...
// org.junit.runners.BlockJUnit4ClassRunner public class BlockJUnit4ClassRunner extends ParentRunner<FrameworkMethoc>{
...(略) protected Statement methodBlock(FrameworkMethod method){
Object test;
try{
test = new ReflectiveCallable(){
@Override
protected Object runReflectiveCall() throws Throwable{
return createTest();
}
}.run();
}catch(Throwable e){
return new Fail(e);
} // 各种Statement
Statement statement = methodInvoker(method, test);
statement = possiblyExpectingExceptions(method, test, statement);
statement = withPotentialTimeout(method, test, statement);
statement = withBefores(method, test, statement);
statement = withAfters(method, test, statement);
statement = withRules(method, test, statement);
return statement;
} // 根据反射,执行无参构造函数
protected Object createTest() throws Exception{
return getTestClass().getOnlyConstructor().newInstance();
} // Statement builders
protected Statement methodInvoker(FrameworkMethod method, Object test){
return new InvokeMethod(method, test);
}
}

2.Statement 的实现类

  • org.junit.internal.runners.statements包下

    • ExpectException
    • Fail
    • FailOnTimeOut
    • InvokeMethod
    • RunAfters
    • RunBefores
// @Test(expected=IndexOutOfBoundsException.class)

// 源码 org.junit.internal.runners.statements.ExpectException
public class ExpectException extends Statement{
private final Statement next;
private final Class<? extends Throwable> expected; public ExpectException(Statement next, Class<? extends Throwable> expected){
this.next = next;
this.expected = expected;
} @Override
public void evalute() throws Exception{
boolean complete = false;
try{
next.evalute();
complete = true;
}catch(AssumptionViolatedException e){
throw e;
}catch(Throwable e){
if(!expected.isAssignableFrom(e.getClass())){
String message = "Unexpected exception, expected<"
+ expected.getName() + "> but was<"
+ e.getClass().getName() + ">";
throw new Exception(messge, e);
}
}
if(complete){
throw new AssertionError("Expected exception: "
+ expected.getName());
}
}
}

参考资料:

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

  1. JUnit4.12 源码分析之TestClass

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

  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. MyBatis 源码分析——生成Statement接口实例

    JDBC的知识对于JAVA开发人员来讲在简单不过的知识了.PreparedStatement的作用更是胸有成竹.我们最常见用到有俩个方法:executeQuery方法和executeUpdate方法. ...

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

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

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

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

  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. QQ连连看-外挂

    QQ连连看-外挂 2014-11-06 参考 [1] [视频教程] c语言实践课程之qq连连看辅助开发 [2] CE工具下载 [3] [原创]qq连连看外挂制作详解

  2. 对java中arraylist深入理解

    1.ArrayList插入删除一定慢么? 取决于你删除的元素离数组末端有多远,ArrayList拿来作为堆栈来用还是挺合适的,push和pop操作完全不涉及数据移动操作. 2.ArrayList的遍历 ...

  3. 解决select菜单边框无法设置的问题

    <span style="border:1px solid green; position:absolute; overflow:hidden"><select  ...

  4. Odoo 8.0 new API 之one装饰

    one装饰器的作用是对每一条记录都执行对应的方法,相当于traditional-style中的function 应用举例: 定义的columns now = fields.Datetime(compu ...

  5. Unix系统编程()虚拟内存管理

    在之前学到过进程的内存布局中忽略了一个事实:这一布局存在于虚拟文件中. 因为对虚拟内存的理解将有助于后续对fork系统调用.共享内存和映射文件之类的主题阐述,这里还要学习一下有关虚拟内存的详细内容. ...

  6. [mmc/sdio]Linux下的sdio和mmc

    http://www.cnblogs.com/RandyQ/p/3607107.html

  7. beaglebone black ubuntu display x11 server的配置

     Change default resolution on BeagleBone modesetting vs fbdev digiteltlc May 7th, 2014, 03:28 PM Hi ...

  8. codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。

    限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...

  9. [转]Python中函数的值传递和引用传递

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  10. grid-tooltip扩展方法

    调用:$('#dg').datagrid('doCellTip', { 'max-width': '100px' }); /** * 扩展两个方法 */$.extend($.fn.datagrid.m ...