码迷,mamicode.com
首页 > 其他好文 > 详细

使用注解实现自定义junit(简)

时间:2015-08-09 00:26:22      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:自定义junit   注解   反射   java   

最近在学Spring,发现Spring里面使用了注解(annotation),非常好奇这里面是什么原理!于是就稍微的研究 下其底层的实现原理,然后突然发现junit使用的也是注解的方式,所以决定自定义一个简单版本的junit框架。下面就对junit的实现原理进行分析:
一、首先我们需要先对junit的注解进行声明
我这里就选择了常用的三个注解
@Test、@Before、@After

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface Before {

}

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface Test {

}

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface After {

}

二、定义一个注解信息处理流程
在这里使用了反射的机制来获取对象被注解方法,并且激活这个方法。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Junit {
//传入一个对象实例
    public static void run(Class c) throws InstantiationException,
            IllegalAccessException, IllegalArgumentException,
            InvocationTargetException {
        Method[] methods = c.getDeclaredMethods();//获取对象声明的方法集合
        List<Method> testList = new ArrayList<Method>();//@Test注解的方法集合
        Method afterMethod = null;//@After注解方法
        Method beforeMethod = null;//@Before的注解方法
        for (Method method : methods) {//循环对象声明的所有方法
        //如果有@Test注解,则将该方法加入到Test注解的方法集合
            if (method.isAnnotationPresent(Test.class)) {
                testList.add(method);
            }
            //如果有@Before注解,则引用该方法
            if (method.isAnnotationPresent(Before.class)) {
                beforeMethod = method;
            }
            //如果有@After注解,则引用该方法
            if (method.isAnnotationPresent(After.class)) {
                afterMethod = method;

            }

        }
        //new一个对象实例
        Object obj = c.newInstance();
        //反射激活方法
        for (Method m : testList) {
            if (beforeMethod != null) {
                beforeMethod.invoke(obj, null);
            }

            m.invoke(obj, null);
            if (afterMethod != null) {
                afterMethod.invoke(obj, null);
            }

        }

    }

三、新建一个测试类

public class TestPrductor {

    @Before
    public void testBefore(){
        System.out.println("测试before");
    }

    @Test
    public void testAdd(){
        System.out.println("测试添加");
    }
    @Test
    public void testDel(){
        System.out.println("测试删除");
    }
    @After
    public void testAfter(){
        System.out.println("测试after");
    }

}

四、运行这个测试类

import java.lang.reflect.InvocationTargetException;

public class JunitTest {
    public static void main(String args[]) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Junit.run(TestPrductor.class);
    } 
}

结果如图:
技术分享
程序源码下载地址:http://download.csdn.net/detail/q5841818/8979275

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用注解实现自定义junit(简)

标签:自定义junit   注解   反射   java   

原文地址:http://blog.csdn.net/q5841818/article/details/47364139

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!