之前编写了一个测试某个类中加注解的方法是否有异常,并将结果记录到文件中;现在升级一下,编写一个测试某个包下所有加测试注解的java类中的所有方法,(当然也可以测试一部分方法,再加个方法的自定义注解,感觉没什么必要就没有实现),并将测试结果保存到文件中。
package CheShiKuangJia;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/*
手动编写测试框架
功能:
可测试CheShiKuangJia包下所有加了Check1注解的java类中的所有方法,并纪录到文件bug1.txt中
可以将包路径设置为参数,日后开发中使用时直接传参,方便统一查看测试结果
*/
public class TestCheck1 {
public static void main(String[] args) throws Exception {
File directory = new File("anno\\src\\CheShiKuangJia");
if (directory.exists()){
//包存在
File[] files = directory.listFiles();
if (files!=null){
//包不为空
List<String> list=new ArrayList<>();//存储java类名
for (int i = 0; i < files.length; i++) {
String name=files[i].getName();
if (name.endsWith(".java")){
list.add(name.substring(0,name.length()-5));
}
}
Class[] cls=new Class[list.size()];//存储所有class
int number = 0;//出现异常的次数
//记录测试结果文件
BufferedWriter bw = new BufferedWriter(new FileWriter("anno\\src\\CheShiKuangJia\\bug1.txt"));
for (int i = 0; i < cls.length; i++) {
//加载类进入内存
Class aClass = Class.forName("CheShiKuangJia." + list.get(i));
//接口不能创建对象,所以过滤掉以Check开头的java类
if (!list.get(i).startsWith("Check")) {
//创建class类对象
Object obj = aClass.newInstance();
//测试添加Check1注解的类
if (aClass.isAnnotationPresent(CheShiKuangJia.Check1.class)) {
//使用getDeclaredMethods()方法获取所有声明的方法对象但是不包括继承方法
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
try {
//执行方法
method.invoke(obj);
} catch (Exception e) {
//捕获异常,纪录到文件中
number++;
bw.write(method.getName() + "方法出异常了");
bw.newLine();
bw.write("异常的名称:" + e.getCause());
bw.newLine();
bw.write("异常原因:" + e.getMessage());
bw.newLine();
bw.write("--------------------------------------------------");
bw.newLine();
}
}
}
}
}
bw.write("本次测试一共出现了" + number + "次异常");
bw.flush();
bw.close();
}
}
}
}
注解Check1
package CheShiKuangJia;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Check1 {
}
测试类
package CheShiKuangJia;
@Check1
public class Caculator {
@Check
public void add(){
String str=null;
str.toString();
System.out.println("1+0="+(1+0));
}
@Check
public void subtract(){
System.out.println("1-0="+(1-0));
}
@Check
public void multiply(){
System.out.println("1*0="+(1*0));
}
public void divide(){
System.out.println("1/0="+(1/0));
}
}
package CheShiKuangJia;
@Check1
public class Caculator2 {
public void ceshi(){
String x=null;
x.toString();
}
private String ceshi2(){
String[] str=new String[3];
return str[3];
}
}
bug1.txt
add方法出异常了
异常的名称:null
异常原因:java.lang.NullPointerException
--------------------------------------------------
divide方法出异常了
异常的名称:null
异常原因:java.lang.ArithmeticException: / by zero
--------------------------------------------------
ceshi方法出异常了
异常的名称:null
异常原因:java.lang.NullPointerException
--------------------------------------------------
ceshi2方法出异常了
异常的名称:Class CheShiKuangJia.TestCheck1 can not access a member of class CheShiKuangJia.Caculator2 with modifiers "private"
异常原因:null
--------------------------------------------------
本次测试一共出现了4次异常