JUnit

2018-12-13  本文已影响0人  沉浮_0644
package cn.tedu.demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * 定义其特殊含义为单元测试功能。
 * Retention:作用是组件的传播范围,取值RUNTIME时候,注解将传播到“运行期间”(默认SOURCE)
 * Target:指标注位置。METHOD:方法.(默认值是任何位置都可以标注)
 *
 *@Retention 和  @Target其“特殊意义”由Java编译器负责处理解析。
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {

}
package cn.tedu.demo;

public class TestCase {
    /**
     * 在方法上标注  自定义注解 @Test
     * 由于注解Test的传播属性的是RUNTIME,所以Test注解会一直传播到软件运行期间(方法区中)
     */
    @Test
    public void test() {
        System.out.println("Hello JUnit");
    }
    @Test
    public void demo() {
        System.out.println("Demo");
    }
}
package cn.tedu.demo;

import java.lang.reflect.Method;

public class Junit4 {
    
    public static void main(String[] args) throws Exception {
        /**
         * JUnit4的原型
         * 
         * 1、动态加载被测试的类
         * 2、动态创建被测试的对象
         * 3、动态查找测试类中标注了 @Test 注解的测试方法
         * 4、利用反射在对象上调用测试方法
         * 
         * 通过如上代码解析@Test注解,为注解实现其特殊功能,就是自动执行标注了@Test的方法
         */
        
        //动态加载类(这里测试线写死)
        String className = "cn.tedu.demo.TestCase";
        Class cls = Class.forName(className);
        
        //利用反射动态创建cls类型的实例
        Object object= cls.newInstance();
        
        //找到所有方法
        Method[] methods = cls.getDeclaredMethods();
        
        for(Method method : methods) {
            //查找包含 @Test 注解的方法
            Test test = method.getAnnotation(Test.class);
            
            if(test != null) {
                //利用反射调用方法
                method.invoke(object);
            }
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读