JUnit4.12 源码分析之Statement
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包下ExpectExceptionFailFailOnTimeOutInvokeMethodRunAftersRunBefores
// @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的更多相关文章
- JUnit4.12 源码分析之TestClass
1. TestClass // 源码:org.junit.runners.model.TestClass // 该方法主要提供方法校验和注解搜索 public class TestClass impl ...
- JUnit4.12 源码分析(二)之TestRule
1. TestRule TestRule和@Before,@After,@BeforeClass,@AfterClass功能类似,但是更加强大; JUnit 识别TestRule的两种方式: 方法级别 ...
- 【JUnit4.10源码分析】5 Statement
假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...
- 【JUnit4.10源码分析】6.1 排序和过滤
abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUn ...
- 12.源码分析—如何为SOFARPC写一个序列化?
SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...
- MyBatis 源码分析——生成Statement接口实例
JDBC的知识对于JAVA开发人员来讲在简单不过的知识了.PreparedStatement的作用更是胸有成竹.我们最常见用到有俩个方法:executeQuery方法和executeUpdate方法. ...
- 【JUnit4.10源码分析】5.2 Rule
标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Descr ...
- 【JUnit4.10源码分析】3.4 Description与測试树
Description使用组合模式描写叙述一个測试树.组合模式中全部元素都是Composite对象. Description有成员变量private final ArrayList<Descri ...
- Solr4.8.0源码分析(12)之Lucene的索引文件(5)
Solr4.8.0源码分析(12)之Lucene的索引文件(5) 1. 存储域数据文件(.fdt和.fdx) Solr4.8.0里面使用的fdt和fdx的格式是lucene4.1的.为了提升压缩比,S ...
随机推荐
- Ubuntu 15.04 开启远程桌面
1.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,终端命令行输入安装: sudo apt-get install xrdp vnc4server xba ...
- TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法)
TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法) TOTP - Time-based One-time Password Algori ...
- CSS学习笔记(5)--导航ul,li浮动问题
为什么只给li设置浮动,没有给ul设置浮动,ul后的元素div也会跟着浮动? 添加评论 分享 默认排序按时间排序 3 个回答 张思远 程序员 2 人赞同 代码是不是这样的啊?<ul& ...
- 学习PHP垃圾回收机制了解引用计数器的概念
php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“ ...
- CheckBox和richTextBox
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Initialize ...
- 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使 ...
- golang 环境bash 以及shell
standard_init_linux.go:178: exec user process caused "no such file or directory" 2018年04月2 ...
- 【mysql-python】安装+基本使用
安装:从SourceForge.net上下载最新的MySQLdb,http://sourceforge.net/projects/mysql-python/ 运行exe文件 使用 From:http: ...
- 用户控件(ASCX)向网页(ASPX)传值使用反射实现
用户控件向网页传递值,方法非常之多,此博文尝试使用反射来实现.在站点中,建一个网页以及一个用户控件. 网页切换至设计模式,拉用户控件至网页上. Default.aspx: <%@ Page La ...
- Unity3D 物体移动方式总结(转)
1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...