当前位置: 首页 > 科技观察

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

时间:2023-03-19 18:47:22 科技观察

我之前写过一篇关于Java注解和反射的文章:测试开发必须掌握的重要知识点-Spring的核心知识点-Java注解@测试开发必须掌握的知识点:Java反射。你可能会问,这些进阶知识点在实际工作中有哪些应用呢?下面我们就结合java注解和反射的知识写一个实际的案例,让大家对它有更深入的了解!直接上例子!示例需求:模拟Junit4中的用例结构,自定义一个标签作为测试用例的标识。在Junit4中注解@Test来表示测试用例。每个测试用例的本质是测试类中的一个方法,即:@Testpublicvoidtest(){fail("Notyeimplemented");}具体要求:测试类是通过标签默认构造方法是否使用MyTag作为方法是用例的标识。用例的方法必须没有参数。编写runCase(StringpkgName)方法,完成对指定类中测试用例的调用。注解设计首先,需要定义一个注解MyTag,代码如下:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceMyTag{Stringname();}测试用例设计模拟junit4框架,写一个测试类,其中login、info、logout为无参方法,测试是一个带有参数的方法("info");}@MyTag(name="case3")publicvoidlogout(){System.out.println("logout");}@MyTag(name="case4")publicvoidtest(Stringp){System.out.println("logout");}}运行类的设计思路是因为测试类是默认结构方法,所以使用如下API完成类实例化Classclazz=Class.forName(pkgName)Objectobj=clazz.newInstance();因为测试类中的方法比较多,所以我们需要获取所有的方法并按照规则进行过滤,代码如下:Method[]methods=clazz.getMethods();for(Methodmethod:methods){//过滤规则}判断方法的标签是否为MyTag,代码如下:if(method.getAnnotation(MyTag.class)!=null)判断方法是否无参数,代码如下:如果(method.getParameterCount()==0)运行方法,代码如下:method.invoke(obj)完整代码forName(pkgName);Objectobj=clazz.newInstance();Method[]methods=clazz.getMethods();for(Methodmethod:methods){if(method.getAnnotation(MyTag.class)!=null&&method.getParameterCount()==0){method.invoke(obj);//调用方法System.out.println("测试用例名称为:"+method.getName());}}}运行the代码,输出结果如下:logouttestcasenameis:logoutlogintestcasenameis:Thelogininfotestcasenameis:info这是一个模拟Junit4执行用例的demo。当我们在TestTag中随意添加测试用例并执行runCase方法时,测试用例就可以执行成功相信通过这个例子,大家一定会对反射的概念进行注解和更深入的理解!我们的例子目前只支持调用指定类中的测试方法。可以考虑如何实现所有类的测试用例都可以调用吗?