• JUnit4.12 源码分析之TestClass


    1. TestClass

    // 源码:org.junit.runners.model.TestClass
    // 该方法主要提供方法校验和注解搜索
    public class TestClass implements Annotatable{
        private static final FieldComparator FIELD_COMPARATOR = new FieldComparator();
        private static final MethodComparator METHOD_COMPARATOR = new MethodComparator();
    
        // 三个成员变量
        private final Class<?> clazz;
        private final Map<Class<? extends Annotation>, List<FrameworkMethod>> methodsForAnnotations;
        private final Map<Class<? extends Annotation>, List<FrameworkField>> fieldsForAnnotations;
    
        // 由于JDK对标注的处理代价高昂,此处,构造器的作用是为了保证实例的共用
        public TestClass(Class<?> clazz){
            this.clazz = clazz;
            if(clazz != null && clazz.getConstructors().length > 1){
                throw new IllegalArgumentException(
                    "Test class can only have one constructor");
            }
    
            Map<Class<? extends Annotation>, List<FrameworkMethod>> methodsForAnnotations =
                new LinkedHashMap<Class<? extends Annotation>, List<FrameworkMehod>>();
            Map<Class<? extends Annotation>, List<FrameworkField>> fieldsForAnnotations =
                new LinkedHashMap<Class<? extends Annotation>, List<FrameworkField>>();
    
            scanAnnotatedMembers(methodsForAnnotations, fieldsForAnnotations);
    
            this.methodsForAnnotations = makeDeeplyUnmodifiable(methodsForAnnotations);
            this.fieldsForAnnotations = makeDeeplyUnmodifiable(fieldsForAnnotations);
        }
    
        ...(略)
    }
    
    
    // 测试代码
    public class TestUnit(){
        public TestUnit(){}
    
        @Test
        public void addx(int x){
            assertEquals(5, 1+x);
        }
    
        @Test
        public void add(){
            assertEquals(5.0, 4.0, 0.1);
        }
    
        @Test
        public void hello(){
            assertEquals(5.0, 4.0, 0.1);
        }
    }
    
    
    public class TestClassDemo{
    
        public static void main(String[] args) throws Throwable{
            TestClass kclass = new TestClass(TestUnit.class);
            System.out.println(kclass.getName());
    
            // Test.class 就是类中标明 @Test 注解的方法
            List<FrameworkMethod> list = kclass.getAnnotatedMethods(Test.class);
            for(FrameworkMethod fm : list){
                try{
                    fm.invokeExplosively((TestUnit)kclass.getJavaClass().newInstance(), new Object[0]);
                }catch(Throwable e){
                    System.out.println(e);
                }finally{
                    System.out.println(fm.getName() + " invoked!");
                }
            }
        }
    }
    


    参考资料:

  • 相关阅读:
    牛客 158F 青蛙 (贪心)
    牛客 158D a-贝利福斯数
    长沙理工大学第十二届ACM大赛-重现赛 大家一起来数二叉树吧 (组合计数)
    美团2017年CodeM大赛-初赛B轮 黑白树 (树形dp)
    美团2017年CodeM大赛-初赛A轮 C合并回文子串
    活动安排问题
    0和5
    1489 蜥蜴和地下室
    1067 Bash游戏 V2
    1062 序列中最大的数
  • 原文地址:https://www.cnblogs.com/linkworld/p/9059227.html
Copyright © 2020-2023  润新知