zoukankan      html  css  js  c++  java
  • JUnit4.8.2来源分析-2 org.junit.runner.Request

    JUnit4.8.2源代码,最为yqj2065兴趣是org.junit.runner.Request,现在是几点意味着它?

    ①封装JUnit的输入

    JUnit4作为信息处理单元,它的输入是单元測试类——布满各种JUnit4的RUNTIME标注的类,但因为使用反射机制,JUnit4的输入严格地说是一个或多个(组)单元測试类的Class对象。早期版本号的JUnit主要处理一个測试或測试构成的树,在增添了对过滤/ filtering和排序/ sorting支持后,JUnit4增加了这个概念。毕竟依照1.2.4 Java Annotation 提要直接使用反射机制方式。代码会非常复杂。

    ②知子莫若父??

    面向对象中。一般父类不知其子类。然而在这里我们看见了反例。

    BlueJ中生成的JavaDoc

    父类何时应该知道子类?这是一个问题,我仅仅记得在WCF中遇到过数据契约中有个KnownType的东西。Request源码中import其各个子类,并在一系列静态方法中使用它们而返回Request对象。Request是一个抽象类,通过静态方法返回Request(的子类) 的对象,这究竟得和new有多大的仇恨啊。只是我喜欢。

    这些静态方法我不称其为静态工厂

    public static Request aClass(Class<?

    > clazz)

    public static Request classWithoutSuiteMethod(Class<?> clazz)

    public static Request classes(Computer computer, Class<?>... classes)

    public static Request classes(Class<?>...classes)

    public static Request runner(final Runner runner)

    public static Request method(Class<?> clazz, String methodName) {

            Description method= Description.createTestDescription(clazz,methodName);

            return Request.aClass(clazz).filterWith(method);

    }

    Request.method()将一个@Test封装为Request,毕竟@Test是基础。【HelloWorld 的单元測试类TestInJUnit4见源码分析-1

    例程 8-3測试Request类
    package myTest;
    import org.junit.runner.*;
    public class RequestDemo{
        public static void test()throws Exception{
            Request rqst = Request.method(TestInJUnit4.class,"add");
            Result r = new JUnitCore().run(rqst);  
            System.out.println(r.wasSuccessful() );
        }
    }
    


    ③Request运用了工厂方法模式

    Request有一个工厂方法:public abstractRunner getRunner();

    并且Request的设计有一个奇异的地方:在创建对象的时候似乎使用装饰模式?Request为装饰模式中的Component、org.junit.internal.request.ClassRequest为详细组件,而FilterRequest和SortingRequest为详细装饰者(没有抽象Decorator)。而这一切,目的却是为了构建Request相关的Runner。吃惊

    ④Request使用set串接模式

    Request的其它非静态方法filterWith、sortWith能够视为set方法。

    Request.method()中给出了样例:

    return Request.aClass(clazz).filterWith(method);

    本文涉及的类型:Request及其3个子类,Description;涉及的设计模式:工厂方法模式、set串接模式、装饰模式

    相关的类型:Runner、AllDefaultPossibilitiesBuilder、Filter等一下。

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4822869.html
Copyright © 2011-2022 走看看