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的更多相关文章

  1. JUnit4.12 源码分析之TestClass

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

  2. JUnit4.12 源码分析之Statement

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

  3. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  4. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  5. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  6. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  7. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  8. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

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

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

随机推荐

  1. doc转docx以及type对应的类型

    https://blog.csdn.net/flagang/article/details/51454665 // 作为type格式保存到临时文件 // *Variant(0):doc // *Var ...

  2. char数组与string转换

    1.char数组转string 有很多种方法: 假设c字符串定义为char ch[]="hello world!"; 1.向构造函数传入c字符串创建string对象: string ...

  3. java中Keytool的使用总结 (加密 密钥(key)和证书(certificates))

    http://blog.chinaunix.net/uid-17102734-id-2830223.html

  4. wpa wp2 psk的配置方式

    For WPA-PSK ctrl_interface=/var/run/wpa_supplicant ctrl_interface_group=0 eapol_version=1 fast_reaut ...

  5. PHP——动态随机数

    取1-13随机数 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  6. Elixir语言

    Elixir是一个基于Erlang VM的函数式元编程语言(类似Ruby),通过动态语言的灵活的语法和宏能够利用Erlang建立一个并发 分布 失败冗余的高质量代码

  7. 转载:CSS3图标图形生成技术个人攻略

    原始地址:http://segmentfault.com/a/1190000000481320 出处:http://www.zhangxinxu.com/wordpress/?p=4113

  8. 基于WebSocket实现网页版聊天室

    WebSocket ,HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,其使用简单,应用场景也广泛,不同开发语言都用种类繁多的实现,仅Java体系中,Tomcat,Jetty,Sp ...

  9. 【linux】硬盘分区

    fdisk -l fdisk /dev/sda d--删除分区 n-新建分区 p--主分区 e--扩展分区 t--改变分区格式 82为swap分区 w--保存退出 http://www.blogjav ...

  10. c#后台修改前台DOM的css属性示例代码

    <div id = 'div1' runat="server">haha</div> ----------- 后台代码中这样调用 div1.Style[&q ...