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);
}
}
}
}