今日分享开始啦,请大家多多指教~
1.1单元测试
1.什么是单元测试?
答:单元测试是指程序员写的测试代码给自己类中的方法进行预期正确性的验证,单元测试一旦写好了这些测试代码,就可以一直使用,可以实现一定程度上的自动化测试。单元测试一般要使用框架进行。
2.什么是框架?
答:框架是前人或者一些牛逼的技术公司在实战或者研发中设计的一些优良的设计方案或者成型的代码功能,作为一个完整的技术体系发行出来称为框架
单元测试的经典框架: Junit
1.什么是Junit?
答:
-
Junit是Java语言编写的第三方单元测试框架
-
Junit框架的方案可以帮我们方便且快速的测试我们的代码的正确性
2.什么是单元测试?
答:
-
单元:在Java中,一个类就是一个单元
-
单元测试:程序猿用Junit编写的一小段代码,用来对某个类中的某个方法进行功能测试或者业务逻辑测试
1.2Junit框架使用步骤
1.下载这个框架
框架一般都是jar包的形式,jar包里面都是class文件,class文件就是我们调用的核心代码
2.直接用Junit测试代码即可
写测试类:以Test开头,以业务类类名结尾
-
业务名称:UserService
-
测试这个业务类的测试类:TestUserService
在测试类中写测试方法
-
测试方法的命名规范:以Test开头,以业务方法名结尾
-
被测试业务方法:login
-
测试方法名:testLogin
测试方法注意事项
-
必须用public修饰,没有返回值,没有参数
-
必须使用注解@Test修饰
1.3Junit常用注解(4.xx版本)
@Test 测试方法!
@Before: 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次
@After: 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次
@BeforeClass: 用来静态修饰方法,该方法会在所有测试方法之前只执行一次
@AfterClass: 用来静态修饰方法,该方法会在所有测试方法之后只执行一次
1.4Junit常用注解(5.xx版本)
Test 测试方法
@BeforeEach: 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次
AfterEach: 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次
BeforeAll: 用来静态修饰方法,该方法会在所有测试方法之前只执行一次
AfterAll: 用来静态修饰方法,该方法会在所有测试方法之后只执行一次
1.5反射
反射,注解,代理,泛型是Java的高级技术,是以后框架的底层院里必须使用到的技术
1.什么是反射?
答:反射是指对于任何一个类,在“运行的时候”都可以直接得到这个类的全部成分
-
在运行时,可以直接得到这个类的构造器对象(Constructor)
-
在运行时,可以直接得到这个类的成员变量对象(Field)
-
在运行时,可以直接得到这个类的成员方法对象(Method)
2.反射的核心思想和关键就是得到:编译后的class文件对象
3.反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分
1.6反射获取Class类对象
引入:
反射是通过先得到编译以后的Class类对象:字节码文件,然后才可以得到类中的全部成分,进行一些功能设计
反射为一个类的全部成分都设计了一个类型来代表这个对象
-
Class:字节码文件的类型
-
Constructor:构造器的类型
-
Field:成员变量的类型
-
Method:方法的类型
反射获取Class类对象:
1.反射技术的第一步永远是先得到Class类对象:有三种方式获取
-
类名.class
-
通过类的对象.getClass()方法
-
Class.forName(“类的全限名”)
public static Class<?> forName(String className)
2.Class类下的方法
-
String getSimpleName(): 获得类名字符串:类名
-
String getName(): 获得类全名:包名 + 类名
1.7反射获取Constructor构造器
反射中Class类型获取构造器提供了很多的API:
Constructor getDeclaredConstructor(Class...parameterTypes)
- 根据参数匹配获取某个构造器,不关心权限修饰符
Constructor[] getDeclaredConstructors()
- 获取所有申明的构造器
1.8反射获取构造器并初始化对象
反射获取Constructor构造器然后通过这个构造器初始化对象
Constructor的API:
-
T newInstance(Object... initargs): 创建对象,注入构造器需要的数据
-
void setAccessible(true): 修改访问权限,true代表暴力攻破权限,false表示保留
可以通过定位类的构造器对象
如果构造器对象没有访问权限可以通过:void setAccessible(true)打开权限
构造器可以通过T newInstance(Object... initargs) 调用自己,传入参数
1.9反射获取Field成员变量对象
Field getDeclaredField(String name): 根据成员变量名获取对应Field对象
Field[] getDeclaredFields(): 获得所有的成员变量对应的Field对象
1.10成员变量赋值和取值
Field的方法:给成员变量赋值和取值
void set(Object obj,Object value): 给对象注入某个成员变量数据
Object get(Object obj): 获取对象的成员变量的值
void setAccessible(true): 暴力反射,设置为可以直接访问私有类型的属性
Class getType(): 获取属性的类型,返回Class对象
String getName(): 获取属性的名称
1.11反射获取Method方法对象
反射获取类的Method方法对象:
- Method getDeclaredMethod(String name,Class...args)
根据方法名和参数类型获取对应的方法对象
- Method[] getDeclaredMethods()
获得类中所有成员方法对象,返回数组
Method的方法执行:
-
Object invoke(Object obj,Object... args)
-
参数一:触发的是哪个对象的方法执行
-
参数二:args:调用方法时传递的实际参数v
1.12暴力攻击集合泛型
– 反射可以破坏面向对象的封装性(暴力反射)
– 同时可以破坏泛型的约束性
1.13反射的作用
-
可以在运行时得到一个类的全部成分然后操作
-
可以破坏封装性
-
可以破坏泛型的约束性
-
更重要的用途:适合做Java高级框架,基本上主流框架都会基于反射设计一些通用技术功能
今日份分享已结束,请大家多多包涵和指点!