首页 > 代码库 > 【JUnit4.10源代码分析】5.2 Rule

【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




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