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

探索JUnit4扩展:Runner

发表于: 2014-09-23   作者:bijian1013   来源:转载   浏览:
摘要:         参加敏捷培训时,教练提到Junit4的Runner和Rule,于是特上网查一下,发现很多都讲的太理论,或者是举的例子实在是太牵强。多搜索了几下,搜索到两篇我觉得写的非常好的文章。         文章地址:http://www.blogjava.net/jiangshachina/archive/20

        参加敏捷培训时,教练提到Junit4的Runner和Rule,于是特上网查一下,发现很多都讲的太理论,或者是举的例子实在是太牵强。多搜索了几下,搜索到两篇我觉得写的非常好的文章。

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

       

        在使用JUnit的过程中,大家可能会对JUnit进行一些扩展。本文中的示例为JUnit4定义了一个新的Annotation,并相应地对已有的Runner进行扩展,使其能够解析新引入的Annotation。

        本文臆造了一个示例,会在执行单元测试方法之前,自动地为单元测试方法打印日志。该示例会为JUnit定义一个新的Annotation用于指定要打印的日志内容,并对JUnit默认提供的Runner实现BlockJUnit4ClassRunner进行扩展,使其能够识别这个新的Annotation。

1. 定义Annotation

        TestLogger是一个作用于方法的Annotation,它只有一个属性,用于指定日志的内容,其代码如下所示:

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface TestLogger {
    public String log() default "";
}

 

2. 扩展Runner

        JUnit提供了若干个Runner的实现,如BlockJUnit4ClassRunner,Suite,其中BlockJUnit4ClassRunner用来执行单个测试用例类。LoggedRunner将扩展BlockJUnit4ClassRunner,覆写其中的methodBlock()方法。新的methodBlock()方法会在一开始试图获取被执行测试方法中的TestLogger Annotation,如果存在的话,就会打印出指定的日志,每行日志以当时的执行时间与完整方法名作为前缀。该类的代码如下所示:

public class LoggedRunner extends BlockJUnit4ClassRunner {

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

    public LoggedRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected Statement methodBlock(FrameworkMethod method) {
        Method classMethod = method.getMethod();
        TestLogger loggerAnnotation = classMethod.getAnnotation(TestLogger.class);
        if (loggerAnnotation != null) {
            StringBuilder log = new StringBuilder(format.format(new Date()));
            log.append(" ").append(classMethod.getDeclaringClass().getName())
                    .append("#").append(classMethod.getName()).append(": ")
                    .append(loggerAnnotation.log());
            System.out.println(log.toString());
        }

        return super.methodBlock(method);
    }
}

 

3. 应用程序

        Calculator是一个简单的应用程序,其中定义了一个除法方法,代码如下所示:

public class Calculator {

    public int divide(int a, int b) {
        return a / b;
    }
}

 

4. 单元测试程序

        CalculatorTest是一个简单的单元测试程序,它会使用两种方式对Calculator中的divide()方法进行单元测试。其代码如下所示:

@RunWith(LoggedRunner.class)
public class CalculatorTest {

    private static Calculator calculator = null;

    @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特别指定LoggedRunner作为测试执行器(@RunWith(LoggedRunner.class));同时,每个单元测试方法,simpleDivide()与dividedByZero(),都使用了Annotation TestLogger,为其指定日志内容。当执行上述单元测试时,会自动地打印出如下形式的日志内容:

2014-09-23_23:02:33_890 com.bijian.study.CalculatorTest#simpleDivide: a simple division
2014-09-23_23:02:33_890 com.bijian.study.CalculatorTest#dividedByZero: divided by zero, and an ArithmeticException thrown.

 

5. 小结

        通过对BlockJUnit4ClassRunner的扩展,可以让JUnit在运行测试用例时做一些额外的工作。但这种直接修改默认Test Runner的方式并不被提倡,可使用Test Rule来达到相同的扩展目的。

探索JUnit4扩展:Runner

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在前面的文章中对于如何使用Rule对JUnit进行扩展进行了说明,在Rule之前对于JUnit的扩展使用的方式是
2 Junit4
转自http://blog.csdn.net/andycpp/archive/2006/10/09/1327147.aspx 我们在编写大型程序的时候,需
3 Junit4
今天学习了junit4. 1、junit4是一个java单元测试框架,其特点是可以帮助测试程序的预期结果,但是不
4 JUnit4
1.JUnit4全面引入Annotation来执行我们编写的测试 2.JUnit4并不要求测试类继承TestCase父类 3.在一
5 JUnit4
采用Annotation的JUnit 4已经不会霸道的要求你必须继承自TestCase了,而且测试方法也不必以test开头
6 JUnit4
JUnit4概述 JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测
探索 Word 2007 开发(二):扩展 Ribbon Written by Allen Lee Ribbon设计器 VSTO 2005 SE以Ribbon
原文地址:http://blog.csdn.net/tragicguy/article/details/21893065 今天在做一个程序的界面时,
原文:http://blog.csdn.net/tragicguy/article/details/21893065 今天在做一个程序的界面时,需要
今天在做一个程序的界面时,需要在一个列表中显示除文字以外的其他控件,如:Edit、Button、Combo等
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号