前面我寫了關於Java註解和反射的文章,大家可能會問,這些高階的知識點在實際工作中有哪些應用呢?在這裡我們來結合java註解和反射的知識做一個實際案例的編寫,讓大家對其有更深刻的理解!直接上例項!
例項需求
需求:模擬Junit4中的用例結構,自定義一個標籤作為測試用例的標識。
在Junit4中註解@Test表示測試用例,每一個測試用例的本質就是測試類中的一個方法,即:
@Testpublic void test() {fail("Not yet implemented");}
具體要求:
測試類是預設構造方法
透過標籤MyTag作為方法是否為用例的標識
作為用例的方法必須是無參的
寫一個方法runCase(String pkgName),使其能夠完成對指定類中測試用例的呼叫工作
註解設計
首先需要定義一個註解MyTag,程式碼如下:
import java.lang.annotation.Retention;import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface MyTag{String name();}
測試用例設計
模擬junit4框架,寫一個測試類,其中login、info、logout是無參方法,而test是有參方法
public class TestTag{@MyTag(name="case1")public void login(){System.out.println("login");}@MyTag(name="case2")public void info(){System.out.println("info"); }@MyTag(name="case3")public void logout(){System.out.println("logout");}@MyTag(name="case4")public void test(String p){System.out.println("logout"); }}
執行類的設計思路
因為測試類是預設構造方法,所以使用如下API,完成類例項化
Class<?> clazz = Class.forName(pkgName)Object obj = clazz.newInstance();
因為測試類中有很多方法,我們需要獲取所有的方法並按照規則進行過濾,程式碼如下:
Method[] methods = clazz.getMethods();for (Method method : methods) {//過濾規則 }
判斷方法的標籤是否為MyTag,程式碼如下:
If(method.getAnnotation(MyTag.class) != null)
判斷方法是否沒有引數,程式碼如下:
If(method.getParameterCount()==0)
執行方法,程式碼如下:
method.invoke(obj)
完整程式碼
public static void runCase(String pkgName) throws IllegalAccessException,IllegalArgumentException, InvocationTargetException, InstantiationException,ClassNotFoundException { Class<?> clazz = Class.forName(pkgName); Object obj = clazz.newInstance(); Method[] methods = clazz.getMethods();for (Method method : methods) { if(method.getAnnotation(MyTag.class) != null&& method.getParameterCount()==0) { method.invoke(obj); //呼叫方法 System.out.println("測試用例名稱是:"+method.getName());}}}
public static void runCase(String pkgName) throws IllegalAccessException,IllegalArgumentException, InvocationTargetException, InstantiationException,ClassNotFoundException { Class<?> clazz = Class.forName(pkgName); Object obj = clazz.newInstance(); Method[] methods = clazz.getMethods();for (Method method : methods) { if(method.getAnnotation(MyTag.class) != null&& method.getParameterCount()==0) { method.invoke(obj); //呼叫方法 System.out.println("測試用例名稱是:"+method.getName());}}}
執行程式碼,輸出如下:
logout
測試用例名稱是:logout
login
測試用例名稱是:login
info
測試用例名稱是:info
這個就是一個模擬Junit4執行用例的demo,當我們隨意新增TestTag 中的測試用例時,執行runCase方法,都能夠成功執行測試用例。相信透過這個例子大家一定會註解,和反射的概念有了更為深刻的理解!我們的例項目前只支援對於指定某一個類中的測試方法進行呼叫,大家可以考慮如何實現對於某一個包下所有類的測試用例都可以進行呼叫呢?
最新評論