当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

探索JUnit4扩展:使用Rule

发表于: 2014-09-23   作者:bijian1013   来源:转载   浏览:
摘要:         在上一篇文章中,讨论了使用Runner扩展JUnit4的方式,即直接修改Test Runner的实现(BlockJUnit4ClassRunner)。但这种方法显然不便于灵活地添加或删除扩展功能。下面将使用JUnit4.7才开始引入的扩展方式——Rule来实现相同的扩展功能。 1. Rule       &n

        在上一篇文章中,讨论了使用Runner扩展JUnit4的方式,即直接修改Test Runner的实现(BlockJUnit4ClassRunner)。但这种方法显然不便于灵活地添加或删除扩展功能。下面将使用JUnit4.7才开始引入的扩展方式——Rule来实现相同的扩展功能。

1. Rule

        Rule是JUnit4.7才开始提供的一种扩展方式,它能够替代大部分已有的Runner扩展。JUnit包含两种Rule Annotation:@ClassRule与@Rule。@ClassRule应用于测试类中的静态变量,而@Rule应用于成员变量;相同地是,这些变量必须是TestRule接口的实例,且访问修饰符必须为public。

        在上一篇中,对BlockJUnit4ClassRunner进行了扩展,被扩展的方法是methodBlock,现在我们来看看该方法体中的代码:

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= 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;
}

        但在BlockJUnit4ClassRunner中,possiblyExpectingExceptions(),withPotentialTimeout(),withBefores()和withAfters()都已经被标注为过时,JUnit建议使用Rule来替代这些方法的功能。

 

2. TestLogRule

        如上面所述,Rule Annotation要作用于TestRule接口的实例,那么就要先创建一个TestRule的实现类。

TestLogRule.java

package com.bijian.study;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class TestLogRule implements TestRule {

    private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss_SSS");

    @Override
    public Statement apply(Statement base, Description description) {
        TestLogger testLogger = description.getAnnotation(TestLogger.class);
        if (testLogger != null) {
            StringBuilder log = new StringBuilder(format.format(new Date()));
            log.append(" ").append(description.getClassName()).append("#")
                    .append(description.getMethodName()).append(": ")
                    .append(testLogger.log());
        System.out.println(log.toString());
    }

        return base;
    }
}

        如上所示,TestLogRule与上一篇的LoggedRunner的代码有许多相同之处,功能则都是打印出指定的日志,每行日志又以当时的执行时间与完整方法名作为前缀。

 

3. 使用Rule的CalculatorTest

        下面是新的测试类CalculatorTest,它将不使用BlockJUnit4ClassRunner的扩展LoggedRunner作为测试执行器,所以该类没有使用@RunWith(LoggedRunner.class),那么在执行该测试类时仍然会使用BlockJUnit4ClassRunner。

CalculatorTest.java

package com.bijian.study;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;

public class CalculatorTest {

    private static Calculator calculator = null;

    @Rule
    public TestLogRule testLogRule = new TestLogRule();

    @BeforeClass
    public static void createCalculator() {
        calculator = new Calculator();
    }

    @Test
    @TestLogger(log = "a simple division")
    public void simpleDivide() {
        int value = calculator.divide(8, 2);
        Assert.assertTrue(value == 4);
    }

    @Test(expected = ArithmeticException.class)
    @TestLogger(log = "divided by zero, and an ArithmeticException thrown.")
    public void dividedByZero() {
        calculator.divide(8, 0);
    }
}

        与上篇的CalculatorTest相比,本文中的CalculatorTest除了没有使用LoggedRunner之外,还多了两行代码

@Rule
public TestLogRule testLogRule = new TestLogRule();

        在执行单元测试方法之前,BlockJUnit4ClassRunner会调用TestRule/TestLogRule中的apply()方法,即会先打印出日志内容。

 

4. 小结

        使用Rule对JUnit进行扩展,能够避免对默认Runner的扩展,为测试类添加或移除Rule十分方便,而且Rule实现类本身也能很方便地被复用。在下一篇博文中将进一步探索Rule的应用。

 

文章来源:http://www.blogjava.net/jiangshachina/archive/2011/12/14/366289.html

探索JUnit4扩展:使用Rule

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
@Rule是JUnit4的新特性。利用@Rule我们可以扩展JUnit的功能,在执行case的时候加入测试者特有的操作
在JUnit4.7之前用户要扩展JUnit通常采用继承BlockJUnit4ClassRunner的方式,然后在BaseTestCase中通
在上一篇文章中给出了JUnit4.8中如何使用Rule对JUnit进行扩展,在JUnit4.8中存在一个问题就是不能够
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编
这里是一个用Eclipse的JUnit4教程: 首先,在项目下建立一个test包,然后再就是新建测试类,右键,
在项目经常会用到单元测试,这里对Junit在开发中的使用标准及使用方法进行简单的介绍。 1.包目录的
一、题目简介 Junit4的使用及求和测试。 二、源码的github链接 https://github.com/bjing123/test-/
Step1: 下载JUnit4.jar,下载地址在GitHub上:https://github.com/KentBeck/junit/downloads Step2
学习使用JUnit4,既然使用最新版本了,就不要再考虑老版本是如何使用的了,之前有听过JUnit但一直没
转载请注明出处!!!!!! 项目不能引用到其他项目,如果引用到其他项目,需要把其他项目打成jar
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号