zoukankan      html  css  js  c++  java
  • 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!");
                }
            }
        }
    }
    


    参考资料:

  • 相关阅读:
    7年.NET面试Java的尴尬历程
    服务挂后Dump日志
    并发中如何保证缓存DB双写一致性(JAVA栗子)
    如何通过Visual Studio来管理我们的数据库项目
    无需Get更多技能,快速打造一个可持久化的任务调度
    Dapper Use For Net
    2014年——新的开始,新的人生
    途牛网站无线架构变迁实践
    windows 下解决 Time_Wait 和 CLOSE_WAIT 方法
    System.Data.DbType 与其它DbType的映射关系
  • 原文地址:https://www.cnblogs.com/linkworld/p/9059227.html
Copyright © 2011-2022 走看看