9.注解+反射完成简单的测试框架

小A同学定义了一个计算器类Calculator,类中有加减乘除四个方法,现在要测试这个类有没有Bug,如果使用Junit测试需要一个个方法测试比较麻烦,学了注解后,可以自定义一个注解Check,使用注解写一个简单的测试框架TestCheck,然后在所有要测试的方法上写上注解@Check,然后运行测试类TestCheck,这样这些方法就可以被验证有没有异常,有异常就生产一个bug.txt文档来描述异常信息。

注解案例:简单的测试框架

  • 需求:当主方法执行后,会自动执行要检测所有方法(即加了Check注解的方法),判断方法是否有异常,记录到文件中。
  • 技术: 1.注解  2.反射
  • 先获取字节码文件对象,并调用getMethod方法获取方法对象,
  • 然后方法对象调用invoke方法执行此方法对象中封装的方法

定义Calculator类

package annotationTest2;

/**
 * 定义的计算器类,使用自定义注解来测试类中方法有无异常
 */
public class Calculator {

    //加法
    @Check
    public void add(){
        String str=null;
        str.toString();//空指针异常
        System.out.println("1+0="+(1+0));
    }
    //减法
    @Check
    public void sub(){
        System.out.println("1-0="+(1-0));
    }
    //乘法
    @Check
    public void mul(){
        System.out.println("1*0="+(1*0));
    }
    //除法
    @Check
    public void div(){
        System.out.println("1/0="+(1/0));//数学异常
    }
    public void show(){
        System.out.println("无bug...");
    }
}

定义注解@Check

package annotationTest2;

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

/**
 * 自定义Check注解,本次注解不需要传递属性(参数),注解中不需要定义属性
 */
@Target(ElementType.METHOD) //标识注解作用位置在方法上
@Retention(RetentionPolicy.RUNTIME)//标识注解保留到runtime阶段
public @interface Check { }

测试类TestCheck

package annotationTest2;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestCheck {
    public static void main(String[] args) throws IOException {
        //1.创建计算器对象
        Calculator c = new Calculator();
        //2.获取class类对象(从而获取所有方法--反射技术)
        Class cls = c.getClass();
        //3.获取所有的Calculator类中的方法
        Method[] methods = cls.getMethods();

        int number=0;//记录异常的次数
        //创建字符缓冲输出流,参数传递字符输出流,目的地为bug.txt
        BufferedWriter bw = new BufferedWriter(new FileWriter("Annotation\\bug.txt"));

        //4.遍历方法
        for (Method m:methods){
            //5.判断方法上是否有Check注解,使用isAnnotationPresent(Class)
            if(m.isAnnotationPresent(Check.class)){
                //6.有,则执行方法
                try {
                    m.invoke(c);
                } catch (Exception e) {
                    //7.捕获到异常

                    //记录到文件中
                    number++;
                    bw.write(m.getName()+"方法出现异常了");//m.getName获取方法名称
                    bw.newLine();//换行
                    bw.write("异常名称:"+e.getCause().getClass().getSimpleName());
                    bw.newLine();//换行
                    bw.write("异常原因"+e.getCause().getMessage());
                    bw.newLine();
                    bw.write(".......................");
                    bw.newLine();
                }
            }
        }
        bw.write("本次测试一共出现"+number+"次异常");
        bw.flush();//把写入到缓冲区的数据刷新到文件bug.txt中
        bw.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值