单元测试

单元测试介绍

我们都是将代码全部写完再进行测试。其实这样并不是很好。
在以后工作的时候,都是写完一部分代码,就测试一部分。这样,代码中的问题可以得到及时修复。
也避免了,由于代码过多,从而无法准确定位到错误的代码。
什么是单元测试
对部分代码进行测试
image.png

Junit概述

JUnit 是一个 Java 编程语言的单元测试工具。是一个非常重要的测试工具。

Junit特点

JUnit 是一个开放源代码的测试工具。
JUnit 可以很方便的对Java中的方法进行测试,提高测试效率。
JUnit 在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色

IDEA导入junit的jar包

image.png

Junit使用的基本流程

将junit的jar包导入到工程中。
编写测试方法:方法必须是 public、无参数、无返回值的非静态方法
在测试方法上加上 @Test 注解。

选中测试方法右键通过junit运行该方法

Junit常用注解

image.png
什么是单元测试?
对部分代码进行测试。
单元测试使用哪个注解
@Test

反射

反射概述

Java反射机制
在程序的运行过程中, 通过Class对象得到类中的信息(构造方法,成员方法,成员变量), 并操作他们
这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
反射的应用场景?
1.IDEA的智能提示。
2.框架 Spring、SpringMVC、Mybatis 等的底层原理。
利用反射调用它类中的属性和方法时,无视修饰符。
使用反射创建对象,代码更复杂,功能更强大灵活。
image.png

Class对象介绍

在Java中有一个类,类名就叫Class
public class Class {
保存类中的信息(构造方法, 成员方法, 成员变量)
}
Class类创建的对象我们成为Class对象
image.png

三种获取Class对象的方式.

类名.class
对象.getClass()
Class.forName(“类全名”);

image.png

获取Class对象的信息

Class类中的方法:
String getSimpleName():获得类名
String getName(): 获得类全名:包名+类名

反射获取构造方法Constructor并使用

Class类中获取构造方法
Constructor<?>[] getConstructors():返回public修饰的所有构造方法对象的数组
Constructor getConstructor(Class<?>… parameterTypes):返回public修饰的单个构造方法对象

Constructor<?>[] getDeclaredConstructors():返回任意权限的所有构造方法对象的数组
Constructor getDeclaredConstructor(Class<?>… parameterTypes):返回任意权限的单个构造方法对象
Constructor类中用于创建对象的方法
T newInstance(Object… initargs):根据指定的构造方法创建对象
setAccessible(boolean flag):设置为true,表示允许对私有权限的访问

反射获取成员方法Method并使用

Class类中获取成员方法

Method[] getMethods():返回所有public的成员方法对象的数组,包括继承的。
Method getMethod(String name, Class<?>… parameterTypes) :返回单个public的成员方法对象。
参数name:表示方法名 ;参数parameterTypes:表示方法的形参类型
Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getDeclaredMethod(String name, Class<?>… parameterTypes):返回单个成员方法对象。

Method类中的方法

Object invoke(Object obj, Object… args):运行方法
参数obj:调用成员方法的对象。(如果调用的是静态方法,该参数为null即可)
参数args :可变参数,表示调用方法时传递的实参(如果没有就不写)
返回值Object :方法的返回值(如果没有就不用接)

反射获取成员变量Field并使用

Class类中获取成员变量

Field getField(String name):返回单个公共成员变量对象
Field[] getFields():返回所有公共成员变量对象的数组,包括继承的public成员变量
Field getDeclaredField(String name):返回单个成员变量对象
Field[] getDeclaredFields():返回所有本类成员变量对象的数组。不包括继承的

Field类中的方法

void set(Object obj, Object value):赋值。参数obj为成员变量所在的对象,参数value为成员变量的值
Object get(Object obj) :获取值。参数obj为成员变量所在的对象

注解

Annotation表示注解。是JDK1.5的新特性。
注解的主要作用:对我们的程序进行标注。通过注解可以给类增加额外的信息。
注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。
image.png

自定义注解的格式

自定义注解格式
image.png

注解的属性类型

image.png

自定义注解的使用

使用自定义注解格式
@注解名(属性名1=值1, 属性名2=值2)
image.png
自定义注解的特殊情况
当注解中只有”一个属性”, 并且属性名是”value”, 使用注解时, 可以省略value属性名
image.png

元注解

元注解是指: 修饰注解的注解.
image.png

Target

作用:用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置。
可使用的值定义在 ElementType枚举类 中,常用值如下:
TYPE,类,接口
FIELD, 成员变量
METHOD, 成员方法
PARAMETER, 方法形参
CONSTRUCTOR, 构造方法
LOCAL_VARIABLE, 局部变量

@Retention

作用:用来标识注解的生命周期。(即该注解会保留到哪个阶段)
可使用的值定义在 RetentionPolicy枚举类 中,常用值如下:
SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在。
CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在。(默认值)
RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段。

注解解析

什么是注解解析
使用Java反射技术,获得注解的属性数据的过程,称为注解解析
image.png

注解解析相关方法:

image.png
Field,Method,Constructor,Class 等反射相关的类可以调用以上方法。
通过反射来解析注解,注解在谁头上就用谁来解析。
注解在类上,使用Class来获取。
注解在构造方法上,使用Constructor来获取。
注解在成员方法上,使用Method来获取。
注解在成员变量上,使用Field来获取。