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

最近在学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

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

时间: 2024-10-24 04:31:24

使用注解实现自定义junit(简)的相关文章

深入浅出Java Annotation(元注解和自定义注解)

一.基本概述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中. 二.原理 Annotation其实是

一起写框架-Ioc内核容器的实现-基础功能-组件注解支持自定义的对象名(九)

实现功能 如果扫描组件注解(@Controller,@Service,@Repository,@Component)默认对象名,已经实现了默认使用首字母小写类名的作为对象名. 但,现实需求中.我们有时候希望可以自己定义对象的名. 实现思路 1.获得扫描组件注解的name属性的值. 2.将这个值作为对象名 实现步骤 1.在AbstractApplicationContext增加一个方法getComponentOfName,用于判断组件注解是否设置了name属性.如果设置了就获得该值 1 /** 2

spring中的aop注解(整合junit测试)

使用spring中的aop前先来了解一下spring中aop中的一些名词 Joimpoint(连接点):目标对象中,所有可能增强的方法 PointCut(切入点):目标对象,已经增强的方法 Advice(通知/增强):增强的代码 Target(目标对象):被代理对象 Weaving(织入):将通知应用到切入点的过程 Proxy(代理):将通知织入到目标对象之后,形成代理对象 aspect(切面):切入点+通知 一:不使用spring的aop注解 以javaEE中的service层为例 UserS

Java注解应用,自定义注解映射实现方案说明.

插件结构如图: 注册模块定义了三个:用于实体与表映射的注解,用于属性到表字段的映射,用于映射时过滤掉的注解. 1.用于实体与表映射的注解 package com.dobby.plugins.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.a

Esper系列(二)时间窗口、长度窗口、cast、注解、自定义函数、静态方法

长度窗口实现原理图 说明: 上图长度窗口为5,事件W1至W5进入引擎后属于NewEvents队列,事件W6进入引擎后,W2至W6就属于NewEvents队列,而事件W1就属于OldEvents队列了.NewEvents为先进先出队列,队列长度为EPL语句中制定的长度窗口大小,OldEvent队列为过期数据的存放队列. EPL长度窗口示例 1  select count(*) as result from orderEvent.win:time_batch(3 sec)   时间窗口实现原理图 说

Android提供的常用注解以及自定义注解代替枚举

上篇博客嘀咕了注解的基本知识.这篇和大家唠唠Android提供的一些编译限制注解以及怎么自定义贴合自己项目框架的限制注解 Android支持Java默认的那些注解,同时通过一些依赖库也额外提供了很多注解,了解并熟练使用这些注解能够让你的代码更加严谨,结构更加清晰.架构更易维护 Android support library从19.1版本开始引入了一个新的注解库Support Annotations support appcompa-v7里面默认包含了这个库,如果你没有使用的话也可以通过添加单独依

hibernate validation内置注解及自定义注解

1 Bean Validation 中内置的 constraint 2 @Null 被注释的元素必须为 null 3 @NotNull 被注释的元素必须不为 null 4 @AssertTrue 被注释的元素必须为 true 5 @AssertFalse 被注释的元素必须为 false 6 @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 7 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 8 @DecimalMin(value)

Java注解(自定义注解、view注入)

注解这东西虽然在jdk1.5就加进来了,但他的存在还是因为使用Afinal框架的view注入才知道的.一直觉得注入特神奇,加了一句就可以把对应view生成了. 下面我们来认识一下注解这个东西 一.注解相关知识 注解相当于一种标记,在javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 1.元注解:作用是负责注解其他注解.Java5.0定义了4个标准的meta-annotati

springmvc 自定义注解 以及自定义注解的解析

1,自定义注解名字 @Target({ElementType.TYPE, ElementType.METHOD})   //类名或方法上@Retention(RetentionPolicy.RUNTIME)//运行时 @component//自定义多个注解,且在一个类中添加两个或以上的,只需要加一个 否则会实例化多次.public @interface SocketMapping { String value() default "";//参数} 2.测试类 @SocketMappin