小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();
}
}