JavaEE-Junit测试、反射与注解的使用

一、Junit单元测试

测试分类

  1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值

  2. 白盒测试:需要写代码。关注程序具体的执行流程,Junit就属于其中的一种。

Junit使用

  1. 定义一个测试类(测试用例)
  2. 定义测试方法:可以独立运行

    返回值用void;方法名为test测试的方法名,如 testAdd() ;参数列表为空

  3. 给方法加@Test
  4. 导入junit依赖环境

初始化方法 @Before

用于资源申请,修饰的方法会在测试方法之前被自动执行

释放资源方法 @After

修饰的方法会在执行之后自动被执行

二、反射:框架设计的灵魂

框架设计的灵魂

学习反射可以帮助你更好的使用和设计框架,所谓反射,就是将类的各个组成部分封装为其他对象,这就是反射机制

java代码在计算机中经历的三个阶段

将成员变量封装为Field对象,将构造方法封装为Constructor对象,将成员方法封装为Method对象。

反射可以干什么

  1. 可以在程序运行过程中,操作这些对象
  2. 可以解耦,提高程序的可扩展性

点击查看反射的详细内容

三、注解

概念

一种代码级别的说明,给计算机看的,是JDk1.5后的特性,可声明在包、类、字段、方法、局部变量、方法参数的前面

作用分类

  1. 编译检查:通过代码里标识的注解让编译器能实现基本的编译检查【Override】
  2. 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
  3. 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

JDK中基本的预定义注解

@Override

检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated

将该注解标注的内容,已经过时

@SuppressWarnings

压制警告

注解本质上就是一个接口,该接口默认继承Annotation接口

原注解

用于描述注解的注解

  • @Target:描述注解能够作用的位置
  • ElementType取值:Type(可以作用于类);METHOD(可作用于方法);FIELD(可作用于成员变量)

  • @Retention:描述注解被保留的阶段
  • @Documented:描述注解是否被抽取到api文档中
  • @Inherited:描述注解是否被子类继承

四、简单的测试框架

使用测试框架可以一次测试多个方法,需要测试哪个方法就给其加上Check注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package an_li;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//当主方法执行后,会自动自行检测所有加了注解的方法,判断是否异常,记录到文件
public class TestCalculator {
public static void main(String[] args) throws IOException {
//1.创建对象
Calculator c = new Calculator();
//2.获取字节码文件对象
Class<? extends Calculator> cls = c.getClass();
//3.获取所有方法
Method[] methods = cls.getMethods();
//出现异常次数
int number=0;
BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));
for(Method method:methods){
//4.判断方法上是否有Check注解
if(method.isAnnotationPresent(Check.class)){
//5.有,执行
try {
method.invoke(c);
} catch (Exception e) {
//6.捕获异常
//记录到文件中
number++;
bw.write(method.getName()+"方法出异常了");
bw.newLine();
bw.write("异常名称"+e.getCause().getClass().getSimpleName());
bw.newLine();
bw.write("异常原因"+e.getCause().getMessage());
bw.newLine();
bw.write("----------------");
bw.flush();
}
}
}
bw.newLine();
bw.write("本次共"+number+"次异常");
bw.close();
}
}

请我喝杯咖啡吧~

支付宝
微信