单元测试
单元测试:针对最小的功能单元(方法),编写测试代码对其进行正确性测试。
Junit单元测试框架
Junit单元测试框架:可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)
优点:可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。不需要程序员去分析测试的结果,会自动生成测试报告出来。
需求:某个系统,有多个业务方法,请使用Junit单元测试框架,编写测试代码,完成对这些方法的正确性测试。
具体步骤
①将Junit框架的jar包导入到项目中 (注意:IDEA集成了Junit框架,不需要我们自己手工导入了)
②为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
③测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试
④开始测试:选中测试方法,右键选择"JUnit运行",如果测试通过则是绿色;如果测试失败,则是红色
Junit单元测试框架的常用注解
Uunit 4.xxxx版本
|--------------|-----------------------------------|
| 注解 | 说明 |
| @Test | 测试类中的方法必须用它修饰才能成为测试方法,才能启动执行 |
| @Before | 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。 |
| @After | 用来修饰一一个实例方法,该方法会在每一个测试方法执行之后执行一次。 |
| @BeforeClass | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。 |
| @AfterClass | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。 |
- 在测试方法执行前执行的方法, 常用于初始化资源。
- 在测试方法执行完后再执行的方法,常用于释放资源。
Uunit 5.xxxx版本
|------------|-----------------------------------|
| 注解 | 说明 |
| @Test | 测试类中的方法必须用它修饰才能成为测试方法,才能启动执行 |
| @Before | 用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。 |
| @AfterEach | 用来修饰一一个实例方法,该方法会在每一个测试方法执行之后执行一次。 |
| @BeforeAll | 用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。 |
| @AfterA11 | 用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。 |
- 开始执行的方法:初始化资源。
- 执行完之后的方法:释放资源。
反射
反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
获取类的信息、操作它们
获取类
获取类的字节码Class对象有三种方式:
Class c1 = 类名.class
调用Class提供方法:public static Class forName(String className)
Object提供的方法:Class c3 =对象.getClass()
获取类的构造器
Class提供了从类中获取构造器Constructor对象的方法
|-----------------------------------------------------------------------|------------------------|
| 方法 | 说明 |
| Constructor<?>[ ] getConstructors() | 获取全部构造器(只能获取public修饰的) |
| Constructor<?>[ ] getDeclaredConstructors() | 获取全部构造器(只要存在就能拿到) |
| Constructor<T> getConstructor(Class<?>... parameterTypes) | 获取某个构造器(只能获取public修饰的) |
| Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 获取某个构造器( 只要存在就能拿到) |
获取类构造器的作用:初始化一个对象返回
|-----------------------------------------|--------------------------------------|
| Constructor提供的方法 | 说明 |
| T newInstance(Object... initargs) | 调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制,可以直接访问私有构造器(暴力反射) |
获取类的成员变量
Class提供了从类中获取成员变量Field对象的方法
|--------------------------------------------|---------------------------|
| 方法 | 说明 |
| public Field[ ] getFields() | 获取类的全部成员变量(只能获取public修饰的) |
| public Field[ ] getDeclaredFields() | 获取类的全部成员变量(只要存在就能拿到) |
| public Field getField(String name ) | 获取类的某个成员变量(只能获取public修饰的) |
| public Field getDeclaredField(String name) | 获取类的某个成员变量(只要存在就能拿到) |
Field类可以对类的属性进行赋值和取值
|-----------------------------------------|--------------------------|
| 方法 | 说明 |
| void set(object obj,object value) | 赋值,需要指定要为哪个类赋值 |
| object get(object obj) | 取值,需要指定要取哪个类赋值 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |
获取类的成员方法
Class提供了从类中获取成员变量Method对象的方法
|-----------------------------------------|--------------------------|
| 方法 | 说明 |
| void set(object obj,object value) | 赋值,需要指定要为哪个类赋值 |
| object get(object obj) | 取值,需要指定要取哪个类赋值 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |
Method对象可以用来执行方法
|-------------------------------------------------|--------------------------|
| 方法 | 说明 |
| public object invoke(object obj,object... args) | 触发某个对象的该方法执行。 |
| public void setAccessible(boolean flag) | 设置为true,表示禁止检查访问控制(暴力反射) |
注解
注解就是Java代码里的特殊标记,比如:@Overide、@Test等。作用是:让其他程序根据注解信息来决定怎么执行该程序。
注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。
注解本质是一个接口,Java中所有注解都继承了Annotation接口
@注解(...):就是一个实现类对象,实现了该注解以及Annotation接口。
自定义注解
格式
public @interface 注解名称{
public 属性类型 属性名() [default 默认属性值];
}
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不写!!
元注解
元注解:修饰注解的注解,常用的有两个,分别是@Target和@Retention
@Target:声明被修饰的注解只能在哪些位置使用
@Target(ElementType.TYPE)
TYPE,类,接口
FIELD,成员变量
METHOD,成员方法
4.PARAMETER,方法参数
5.CONSTRUCTOR,构造器
6.LOCAL VARIABLE,局部变量
@Retention:声明注解的保留周期,
@Retention(RetentionPolicy.RUNTIME)
- SOURCE:只作用在源码阶段,字节码文件中不存在。
2.CLASS(默认值):保留到字节码文件阶段,运行阶段不存在
3.RUNTIME(开发常用):一直保留到运行阶段。
解析注解
Class 、Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。AnnotatedElement接口提供了解析注解的方法
|-------------------------------------------------------------------------|-----------------|
| 方法 | 说明 |
| public Annotation[ ]getDeclaredAnnotations() | 获取当前对象上面的注解 |
| public TgetDeclaredAnnotation (Class<T>annotationClass) | 获取指定的注解对象 |
| public boolean isAnnotationPresent (class<Annotation>annotationClass) | 判断当前对象上是否存在某个注解 |