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

TestRule声明工厂方法

TestRule是一个工厂方法模式中的Creator角色——声明工厂方法。

package org.junit.rules;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public interface TestRule {
	Statement apply(Statement base, Description description);
}

测试程序员要使用Rule,必须编写代码:

1.MyStatement——Statement的一个新的装饰对象。( JUnit之Rule的使用中的例子),地位等同于ExpectException。

package rule;
import static tool.Print.*;//pln(Object)
import org.junit.runners.model.Statement;
/**
 *
 * @author yqj2065
 */
public class MyStatement extends Statement {
    private final Statement base;
    public MyStatement( Statement base ) {
        this.base = base;
    }

    @Override public void evaluate() throws Throwable {
        pln( "before...sth..sth" );
        try {
            base.evaluate();
        } finally {
             pln( "after...sth..sth" );
        }
    }
}

2.一个具体的工厂,也就是定义工厂方法的TestRule的子类。MyRule将创建一个Statement的新的装饰对象MyStatement。如同工厂方法模式的一般用法,具体工厂与具体产品一一对应。

package rule;
import org.junit.rules.TestRule;
import org.junit.runners.model.Statement;
import org.junit.runner.Description;
public class MyRule implements TestRule  {
    @Override
    public Statement apply(Statement base, Description description) {
        return new MyStatement( base );
    }
}

3.使用新的装饰对象

用户类BlockJUnit4ClassRunner使用的是ExpectException等JUnit内建的Statement装饰对象;测试程序员编写的Statement装饰对象,则需要通过@Rule,嵌入到单元测试类中

package rule;
import org.junit.Rule;
import org.junit.Test;
public class MyTest {
    @Rule
    public MyRule myRule = new MyRule();

    @Test()
    public void xx() {
        System.out.println( "xx()..." );
    }
}

在开发环境中运行MyTest,输出:

before...sth..sth

xx()...

after...sth..sth

RuleChain

时间: 2024-10-11 03:16:53

【JUnit4.10源代码分析】5.2 Rule的相关文章

【JUnit4.10源代码分析】0导航

JUnit是由GOF 之一的Erich Gamma和 Kent Beck 编写的一个开源的单元测试框架,yqj2065分析JUnit源代码的主要目的是 学习其中对设计模式的运用. JUnit也是一个学习Java编程. 学习框架设计 和研究如何应对版本升级和接口变化的案例. NetBeans IDE 7.4 (Build 201310111528) 的测试库为JUnit4.10,因而在前面对JUnit4.8.2源代码分析的基础上,yqj2065将采用较正规的方式介绍JUnit4.10源代码. 10

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

如果要评选JUnit中最最重要的类型,或者说核心,无疑是org.junit.runners.model.Statement.Runner等类型看起来热闹而已. package org.junit.runners.model; /** * Represents one or more actions to be taken at runtime in the course * of running a JUnit test suite. */ public abstract class State

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

abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤.(虽然JUnit4.8.2源代码分析-6.1 排序和过滤中演示了客户使用排序和过滤的方式,也有些不明白其设计意图,但是,先读懂源代码为妙.说不定看着看着就明白了.) org.junit.runner.manipulation包 排序和过滤的相关类型,在org.junit.runner.manipulation包中. 1.例

【JUnit4.10源代码分析】3.4 Description与测试树

Description使用组合模式描述一个测试树.组合模式中所有元素都是Composite对象. Description有成员变量private final ArrayList<Description>fChildren= newArrayList<Description>(); //无元素 保存其子结点.fChildren非空,所以任何子结点都是一个Composite,但是this. getChildren().size()为0的结点,事实上就是叶子. 测试树 一颗测试树Desc

【JUnit4.10源代码分析】6 Runner

org.junit.runner.Runner是JUnit的工作引擎.它在诸多类型的支持下,处理测试并产生(Description).Failure和Result等输出. Runner的主要类层次如图所示. Describable与Runner 为了保证Runner的子类都有一个Description(虚域模式)数据来源/成员变量,Runner implements Describable. package org.junit.runner; public interface Describab

【JUnit4.10源码分析】5.2 Rule

标注@Rule TestRule是一个工厂方法模式中的Creator角色--声明工厂方法. package org.junit.rules; import org.junit.runner.Description; import org.junit.runners.model.Statement; public interface TestRule { Statement apply(Statement base, Description description); } 因为工厂方法apply有

JUnit4.8.2源代码分析-2 org.junit.runner.Request和Description

JUnit4.8.2源代码中,最令yqj2065感兴趣的是org.junit.runner.Request,它是几个意思呢? ①封装JUnit的输入 JUnit4作为信息处理单元,它的输入是单元测试类--布满各种JUnit4的RUNTIME标注的类,但由于使用反射机制,JUnit4的输入严格地说是一个或多个(组)单元测试类的Class对象.早期版本的JUnit主要处理一个测试或测试构成的树,在增添了对过滤/ filtering和排序/ sorting支持后,JUnit4加入了这个概念.毕竟按照1

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

abstract class ParentRunner<T> extends Runner implements Filterable,Sortable 本节介绍排序和过滤. (尽管JUnit4.8.2源码分析-6.1 排序和过滤中演示了客户使用排序和过滤的方式,也有些不明确其设计意图.可是.先读懂源码为妙.说不定看着看着就明确了. ) org.junit.runner.manipulation包 排序和过滤的相关类型.在org.junit.runner.manipulation包中.Sort

转:SDL2源代码分析

1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提到了一张SDL的原理图,如下所示: 从这个图中可以看出,SDL根据系统的不同调用不同的API完成相应的功能.至于它是如何实现的,将会在后文中详细叙述.下面不再罗嗦,直接进入正题. 使用SDL播放一个视频代码流程大体如下 初始化: SDL_Init(): 初始化SDL.