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時(shí)候吹埠,注解將傳播到“運(yùn)行期間”(默認(rèn)SOURCE)
* Target:指標(biāo)注位置泞遗。METHOD:方法.(默認(rèn)值是任何位置都可以標(biāo)注)
*
*@Retention 和 @Target其“特殊意義”由Java編譯器負(fù)責(zé)處理解析温兼。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}
- 寫一個(gè)被寫測試類俱恶,在方法上標(biāo)注注解
package cn.tedu.demo;
public class TestCase {
/**
* 在方法上標(biāo)注 自定義注解 @Test
* 由于注解Test的傳播屬性的是RUNTIME究孕,所以Test注解會一直傳播到軟件運(yùn)行期間(方法區(qū)中)
*/
@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比搭、動態(tài)加載被測試的類
* 2冠跷、動態(tài)創(chuàng)建被測試的對象
* 3、動態(tài)查找測試類中標(biāo)注了 @Test 注解的測試方法
* 4身诺、利用反射在對象上調(diào)用測試方法
*
* 通過如上代碼解析@Test注解蜜托,為注解實(shí)現(xiàn)其特殊功能,就是自動執(zhí)行標(biāo)注了@Test的方法
*/
//動態(tài)加載類(這里測試線寫死)
String className = "cn.tedu.demo.TestCase";
Class cls = Class.forName(className);
//利用反射動態(tài)創(chuàng)建cls類型的實(shí)例
Object object= cls.newInstance();
//找到所有方法
Method[] methods = cls.getDeclaredMethods();
for(Method method : methods) {
//查找包含 @Test 注解的方法
Test test = method.getAnnotation(Test.class);
if(test != null) {
//利用反射調(diào)用方法
method.invoke(object);
}
}
}
}