自定义java注解(三) 实现Junit中的@Test、@Before、@After

前面两次的自定义注解,都只是解析了一个注解,今天要讲的junit需要三个注解,而且解析框架中反射激活方法时要根据Before、Test、After的顺序来执行,需要注意的是Test注解可能会有多个,所以我们在外面定义一个数组,用来存储所有由@Test标注的方法。下面来看一下具体实现

  1. 三个注解的定义
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Before {

}
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Test {

}
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface After {

}
  1. 在自己的测试类中使用自定义好的三个注解
public class MyJunitTest {

    @Before
    public void prepare(){
        System.out.println(" before :所有的测试方法之前都先执行这个方法");
    }

    @After
    public void destroy(){
        System.out.println(" destroy :所有的测试方法之后都要执行这个方法");
    }

    @Test
    public void testAdd(){
        System.out.println(" test :testadd() ");
    }

    @Test
    public void testUpdate(){
        System.out.println(" test :testUpdate() ");
    }
}
  1. 最重要的注解解析框架
public class ParseJunit {
    public void parseMethod(Class clazz) throws InstantiationException,
            IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {
        Object obj = clazz.newInstance();
        Method[] methods = clazz.getDeclaredMethods();

        //Before 的注解只有一个,直接在外面定义一个Method类型的变量
        Method methodsBefore=null;
        Method[] methodsTest=null;
        int index=0;
        Method methodsAfter=null;

        //循环所有的方法
        for (Method m : methods) {
            //得到方法上的所有注解,因为不确定是Before还是After、Test,不能直接根据class得到注解
            Annotation[] myJunitTest =m.getAnnotations();
            //循环所有的注解,根据名字匹配
            for(int i=0;i<myJunitTest.length;i++){

                //根据名字匹配注解的类型
                if(myJunitTest[0].annotationType().getSimpleName().endsWith("Before")){
                    methodsBefore=m;
                }else if(myJunitTest[0].annotationType().getSimpleName().endsWith("Test")){
                    //如果为 Test ,判断这个数组是否为空,否:存入定义好的 数组中  然后下标加一
                    if(methodsTest==null){
                        //是,新生成一个数组,然后将 m 存入
                        methodsTest=new Method[ methods.length ];
                    }
                    methodsTest[index]=m;
                    index++;
                }else if(myJunitTest[0].annotationType().getSimpleName().endsWith("After")){
                    methodsAfter=m;
                }
            }

        }

        //1、先执行 Before注解的方法
        if(methodsBefore!=null){
            methodsBefore.invoke(obj);
        }
        //2、执行Test 注解的 数组中的方法
        if(methodsTest!=null && methodsTest.length>0){
            for(Method m: methodsTest){
                if(m!=null){

                    m.invoke(obj);
                }
            }
        }
        //3、最后执行 After 注解的方法
        if(methodsAfter!=null){
            methodsAfter.invoke(obj);
        }

    }
}

可能运行效率不是最好的,但是基本效果已经实现,小伙伴们有更好的解决办法,敬请指教啊

4. 下面我们测试一下自定义好的Junit

public void testApp() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
    {
        ParseJunit pj=new ParseJunit();
        pj.parseMethod(MyJunitTest.class);
    }

结果:

自定义注解,最核心的部分就是解析框架的实现,上面提到的三个案例都是基于方法的注解,有兴趣的小伙伴可以找找类注解、属性注解的解析。

版权声明:本文为博主原创文章,谢谢参考!有问题的地方,欢迎纠正,一起进步。

时间: 2024-10-18 02:43:37

自定义java注解(三) 实现Junit中的@Test、@Before、@After的相关文章

java注解及在butternife中的实践和原理

1.  背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候还是InjectView,可以到7.1的时候用的却是BInd,这里面有什么区别吗.简单的说,InjectView是在运行的时间进行注解,而BInd在android安装的时候就执行了,肯定后者的执行效率更高些. 接下来说说java的注解吧. 2.  什么是注解 我们有必要对JDK 5.0新增的注解(A

自定义java注解(二) 实现DBHelper中的getCon( )得到数据库连接

定义一个DBinfo 注解 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface DBinfo { public String URL() ; public String Username() ; public String Password() ; public String Driver() ; } 新建DBHelper,实现 getCo

深入理解Java:自定义java注解

要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email protected], [email protected] 这些类型和它

Java Annotation详解+自定义java注解(一)

上述思维导图的下载地址为:http://download.csdn.net/detail/emilyrr/8975487 注解的注解: 经过上面的学习,我们可以通过元注解来实现一个自定义的HelloWorld注解 第一步:定义一个HelloWorld注解 @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)//定义了注解的作用位置:在方法上 @Inherited//允许子类继承父类中的注解 publ

JAVA注解在SSH开发中的简单应用

在系统开发过程中,出现错误在所难免.虽然系统出错时控制台也会报错,但是因为系统控制台输出太多,往往不能快速定位出现错误的功能点及原因.在此通过使用注解,结合spring的AOP,来制作一个错误输出拦截器. 首先写一个注解类Catcher: @Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface Catcher {     String 

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

java注解例子

java注解在web框架中使用比较广泛,这使得对象之间的关系配置起来更加容易 目前web框架中最常用的两种配置对象依赖关系的方式就是注解和xml配置文件的方法,api配置相对来说用的少一些, 下面实现一个Table注解来实现数据库表和实体bean之间的对应关系,实现一个Column注解来实现数据库表中每个字段和实体bean每个属性之间的 对应关系.java中的orm基本上就是根据这种思想来实现的. Table注解代码: package com.panther.dong.annotation.an

实现自定义View的三种方式

一.组合控件 组合控件,顾名思义,就是将系统原有的控件进行组合,构成一个新的控件.这种方式下,不需要开发者自己去绘制图上显示的内容,也不需要开发者重写onMeasure,onLayout,onDraw方法来实现测量.布局以及draw流程.所以,在实现自定义view的三种方式中,这一种相对比较简单. 实际开发中,标题栏就是一个比较常见的例子.因为在一个app的各个界面中,标题栏基本上是大同小异,复用率很高.所以经常会将标题栏单独做成一个自定义view,在不同的界面直接引入即可,而不用每次都把标题栏

Junit中常用的注解说明

Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能.在junit中常用的注解有@Test.@Ignore.@BeforeClass.@AfterClass.@Before.@After.@Runwith.@Parameters 以下是相关的介绍和使用说明: 一[email protected] 在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类.在junit4中,定义一个 测试方法变得简单很多,只