干货!使用Java注解和反射实现Junit4中的用例调用(附源码)

前面我写了关于Java注解和反射的文章:

测试开发必须掌握的知识点:Spring的核心知识点 -Java反射

测试开发必须掌握的重要知识点-Spring的核心知识点 -Java注解@


大家可能会问,这些高级的知识点在实际工作中有哪些应用呢?在这里我们来结合java注解和反射的知识做一个实际案例的编写,让大家对其有更深刻的理解!直接上实例!

实例需求

需求:模拟Junit4中的用例结构,自定义一个标签作为测试用例的标识。

在Junit4中注解@Test表示测试用例,每一个测试用例的本质就是测试类中的一个方法,即:

@Test

public 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());

}

}

}

运行代码,输出如下:

logout

测试用例名称是:logout

login

测试用例名称是:login

info

测试用例名称是:info

这个就是一个模拟Junit4执行用例的demo,当我们随意添加TestTag 中的测试用例时,执行runCase方法,都能够成功执行测试用例。相信通过这个例子大家一定会注解,和反射的概念有了更为深刻的理解!我们的实例目前只支持对于指定某一个类中的测试方法进行调用,大家可以考虑如何实现对于某一个包下所有类的测试用例都可以进行调用呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容