Junit单元测试&反射&注解

2020-09-02  本文已影响0人  abboo

本节内容

  1. Junit单元测试
  2. 反射
  3. 注解

Junit单元测试

Junit就是单元测试中的一种

public class CalculatorTest {
    /**
     * 初始化方法:
     *  用于资源申请,所有测试方法在执行之前都会先执行该方法
     */
    @Before
    public void init(){
        System.out.println("init...");
    }

    /**
     * 释放资源
     *  在所有方法之后,多会执行该方法
     */
    @After
    public void close(){
        System.out.println("close...");
    }
    /**
     * 测试add方法
     */
    @Test
    public void testAdd(){
        Calculator c = new Calculator();
        int result = c.add(1,2);
        System.out.println("testAdd...");
        // 断言
        Assert.assertEquals(3,result);
    }

}
输出结果:
  init...
  testAdd
  close...

反射:框架设计的灵魂

Java代码三个阶段
public class Person {
    private String name;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        //1.Class.forName("全类名")
        Class cls1 = Class.forName("com.foabo.domain.Person");
        System.out.println(cls1);
        //2.类名.class
        Class cls2 = Person.class;
        System.out.println(cls2);
        //3.对象.getClass()
        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);

        //==比较是哪个对象,判断在内存中是否一样
        System.out.println(cls1 == cls2);//true
        System.out.println(cls1 == cls3);//true
    }
}
className=com.foabo.domain.Person
methodName=eat
public class ReflectTest {
    public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
        //可以创建任意类的对象,可以执行任意方法
        //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,转换为一个集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);

        //2.获取去配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        //3.加载该类进内存
        Class cls = Class.forName(className);
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取对象方法
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);

    }
}
打印结果:
  eat...

将配置文件中的className和methodName换成其他类的也同样适用

注解:

新建一个class文件

/**
 * @ClassName AnnoDemo
 * @Description 演示javadoc注解
 * @Author Patrick Star
 * @Date 2020/9/1 7:40 PM
 * @version 1.0
 * @since 1.5
 */
public class AnnoDemo {
    /**
     * 计算两数的和
     * @param a 整数
     * @param b 整数
     * @return 两数的和 
     */
    public int add(int a,int b){
        return a+b;
    }

}

我们将其复制到一个新建文件夹中,去掉开头的包

$ javadoc AnnoDemo.java
生成以上文件

打开index.html可以看到


生成的doc

如果出现乱码则设置一下编码

让我们来看看@Override的格式

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnno {
    int age();
    String name() default "法外狂徒张三";
    Person per();
    MyAnno2 anno2();
    String[] strs();
}
@MyAnno(age=20,per = Person.P1,anno2 = @MyAnno2,strs ={"aaa","bbb"} )
public class Worker {
}

在之前的案例中,我们在ReflectTest.java文件中通过配置文件去获取className和methodName,而注解可以代替配置文件,我们用注解Pro代替配置文件

/**
 * 描述需要执行的类名,方法名
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}

新建一个ReflectTest类

@Pro(className = "com.foabo.annotation.Demo1",methodName = "show")
public class ReflectTest {
    public static void main(String[] args) {
        //1.解析注解
        //1.1获取该类的字节码文件对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        //2.获取上边的注解对象
        //其实就是在内存中生成了一个该注解接口的子类实现对象
        Pro an = reflectTestClass.getAnnotation(Pro.class);
        //3.调用注解对象中定义的抽象方法,获取返回值
        String className = an.className();
        String methodName = an.methodName();
        System.out.println(className);//com.foabo.annotation.Demo1
        System.out.println(methodName);//show
    }
}
public class Calculator {
    //加法
    @Check
    public void add() {
        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("没有异常");
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Check {
}
/**
 * 简单地测试框架
 * 当主方法执行后,会自动自行被检测的所有方法(加了Check)的方法,判断方法是否有异常,记录到文件中
 */
public class CheckTest {
    public static void main(String[] args) throws IOException {
        //1.创建计算器对象
        Calculator c = new Calculator();
        //2.获取字节码文件对象
        Class cls = c.getClass();
        //3.获取所有方法
        Method[] methods = cls.getMethods();

        int number = 0;
        BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));

        for (Method m : methods) {
            //4.判断方法上是否有Check注解
            if (m.isAnnotationPresent(Check.class)) {
                //5.有,执行
                try {
                    m.invoke(c);
                } catch (Exception e) {
                    //6.捕获异常
                    //记录到文件中
                    number++;

                    bw.write(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();
        bw.close();

    }
}

最后生成的bug.txt中

div方法出异常了
异常的名称:ArithmeticException
异常的原因:/ by zero
---------------------------
本次测试一共出现 1 次异常
上一篇 下一篇

猜你喜欢

热点阅读