JUnit4.12 源码分析(二)之TestRule
1. TestRule
TestRule
和@Before
,@After
,@BeforeClass
,@AfterClass
功能类似,但是更加强大;- JUnit 识别
TestRule
的两种方式:- 方法级别:
@Rule
; - 类级别:
@ClassRule
;
- 方法级别:
TestRule
的实现类:ErrorCollector
ExpectedException
ExternalResource
TemporaryFolder
TestName
TestWatcher
Timeout
Verifier
// org.juit.rules.TestRule 源码
public interface TestRule{
// 只有一个抽象方法
// 子类需要对Statement进行修改
// 返回值:可能是原来的base,或者装饰之后的base,或者一个全新的base
Statement apply(Statement base, Description description);
}
// org.junit.runners.model.Statement
public abstract class Statement{
// 只有一个抽象方法
public abstract void evalute() throws Throwable;
}
// org.junit.rules.ExpectedException
public class ExpectedException implements TestRule{
...(略)
// apply 方法的实现
public Statement apply(Statement base, Description description){
return new ExpectedExceptionStatement(base);
}
// 对Statement的处理
private class ExpectedExceptionStatement extends Statement{
private final Statement next;
public ExpectedExceptionStatement(Statement base){
next = base;
}
@Override
public void evalute() throws Throwable{
try{
next.evalute();
}catch(Throwable e){
handleException(e);
return;
}
if(isAnyExceptionExpected()){
failDueToMissingException();
}
}
}
...(略)
}
1.1 测试示例
// 自定义Statement
public class MyStatement extends Statement{
private final Statement myBase;
public MyStatement(Statement base){
this.myBase = base;
}
@Override
public void evalute() throws Throwable{
System.out.println("方法执行开始之前");
try{
myBase.evalute();
}finally{
System.out.println("方法执行之后");
}
}
}
// 自定义Rule
public class MyRule implements TestRule{
@Override
public Statement apply(Statement base, Description description){
return new MyStatement(base);
}
}
// 自定义Test
public class MyTest{
@Rule
public MyRule myRule = new MyRule();
@Test
public void testCase(){
System.out.println("测试运行....");
}
}
// 控制台输出:
方法执行开始之前
测试运行....
方法执行之后
参考资料:
JUnit之Rule的使用
JUnit4.12 源码分析(二)之TestRule的更多相关文章
- JUnit4.12 源码分析之TestClass
1. TestClass // 源码:org.junit.runners.model.TestClass // 该方法主要提供方法校验和注解搜索 public class TestClass impl ...
- JUnit4.12 源码分析之Statement
1. Statement 抽象类Statement作为命令模式的Command,只有一个方法 各种Runner作为命令模式中的Invoker,将发出各种Statement,来表示它们运行JUnit测试 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>
目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
- 【JUnit4.10源码分析】5 Statement
假设要评选JUnit中最最重要的类型.或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.ru ...
随机推荐
- 使用Crypto++库的CBC模式实现加密(二)
前面已经有一篇介绍使用Crypto++库实现的加密的文章了,但是代码中考虑的不完全,所以就重新发了个二 C++封装: #include "zyaes.h" #include < ...
- floyd算法&迪杰斯特拉算法
; k<=n; k++) ; i<=n; i++) ; j<=n; j++) { gra[i][j]=min(gra[i][j],gra[i][k]+gra[k][j]); } vo ...
- IIS短文件名泄露漏洞危害及防范方法(转)
攻击方法(转自http://blog.sina.com.cn/s/blog_64a3795a01017xqt.html) 一直在寻找一种方法,如果我可以使用通配符"*" 和 &qu ...
- Python教程:[43]Word基本操作
使用python操作Word用到了win32com模块,我们现在就要介绍一下python对Word的基本操作,文章涉及到如何与Word程序建立连接.如果与Word文档建立连接的,以及对Word文档的基 ...
- 使用wc统计代码行数
最近写了一些代码,想统计一下代码的行数,在eclipse中好像没这功能,网上搜了一下才发现原来Linux有一个统计文件行数的命令wc.使用wc可以打印出每个文件和总文件的行数.字数和字节数,如果没有指 ...
- 在CentOS中编译FFmpeg for Android静态库(含fdk aac,x264)
本文可以编译出集成了x264和fdk_aac的库,而且支持neon 下载源码: https://github.com/mstorsjo/fdk-aac http://sourceforge.net/p ...
- CSS旋转&翻转,兼容方案
CSS代码,高级浏览器使用transform,ie用滤镜实现. 转自http://aijuans.iteye.com/blog/19364921 /*水平翻转*/ 2 .flipx { 3 -moz- ...
- tensorflow 保存训练模型ckpt 查看ckpt文件中的变量名和对应值
TensorFlow 模型保存与恢复 一个快速完整的教程,以保存和恢复Tensorflow模型. 在本教程中,我将会解释: TensorFlow模型是什么样的? 如何保存TensorFlow模型? 如 ...
- Servlet中Request的getAttribute getParameter 区别
1.从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据. request.getParameter()方法返回Str ...
- 30Mybatis_mybatis和spring整合-原始dao开发
这篇文章很重要, 第一步:我们讲一下整合的思路: 我们以前要用Mybatis是需要sqlMapConfig.xml(这个配置文件需要配置dataource,以及mapper.xml文件.)sqlMap ...