Junit单元测试
测试的种类:
1、黑盒测试:不需要写代码,只看输入输出
2、白盒测试:需要写代码,看代码具体的流程(Junit单元测试是白盒测试)
-
定义一个测试类(测试用例)
放测试类的包名:xxx.xxx.xx.test
测试类名:被测试的类名Test -
定义测试的方法:可以独立运行
方法名:test测试的方法名
返回值:void
参数列表:空参 -
给方法加@Test (这样方法就可以不在main方法中,而独立运行)
-
导入Junit依赖环境
-
判定结果:红色为错,绿色是对,使用断言来判定结果是不是预期结果,如果是就是绿色,不是就是红色
Assert.assertEquals(期望的结果,真实的结果)
注解@Before和@After
1、@Before ---> 初始化方法,在所有测试方法执行之前默认执行,用于资源申请
2、@After ---> 释放资源方法,在所有测试方法执行完毕之后执行,
如果测试方法有错误也依然执行,一般用于资源释放
反射
反射是框架设计的灵魂(框架:半成品软件。可以在框架的基础上进行软件开发,用于简化编码)
Java代码在计算机中执行的三个阶段
(该图片源自学习视频的截图)
类加载器:把字节码文件加载到内存中,在内存中使用对象来描述字节码文件(有一个类叫做Class类,把字节码中的成员变量封装成Field对象,把构造方法封装成Construction对象,成员方法封装成Methods对象)
反射就是将各个组成部分封装成其他对象(就像类加载器把字节码文件放到内存中的过程)
优点:
1、在程序的运行过程中操作这些对象
2、可以解耦,提高程序的可扩展性
获取.Class对象的三种方式
1、Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
2、类名.class :在Class类对象阶段通过类名的属性class获取
3、对象.getClass():在内存中获取class对象,getClass()方法是在Object类中定义的
获取字节码对象的三种方式
上一节说过Java代码在计算机中执行的三个阶段,其中第二个阶段class类对象阶段有获取字节码的三种方式
-
获取成员变量的对象
(1)Fields[] getFields() 获取所有被public修饰的成员变量,放在数组中返回 (2)Field getField(...)获取指定成员变量的对象,该成员变量只能是被public修饰 (3)Field[] getDeclaredFields() 返回所有被任何权限修饰符修饰的成员变量,Field getDeclaredField(...)返回指定的成员变量对象 (4)操作: get用法:成员变量.get(实体类对象) ---> 返回该实体类对象的指定成员变量的值 set用法:set(实体类对象,要设置的成员变量的值)
暴力反射:成员变量对象.setAccessible(true) ----> 忽略访问权限修饰符的安全检查(暴力反射)(例如私有成员变量是不允许访问的,但是暴力反射可以访问)
-
获取构造方法
通过使用personClass.getConstructor(...)获取有参构造方法,personClass.getConstructor()获取无参构造方法 操作: 1、获取自定义类(如Person类)的字节码文件 2、字节码文件.getConstructor(...)获取有参构造方法,返回一个构造器对象 3、使用刚刚的构造器对象来创建实体对象:构造器对象.newInstance(要传入的参数) 注意:如果要创建无参构造方法的对象,可以使用简化写法:类字节码文件.newInstance()
-
获取成员方法
(1)getMethods() getMethod(指定名称)获取被public修饰的成员方法 (2)getDeclaredMethods() getDeclaredMethods(指定名称)获取任何成员方法 (3)操作 : * 执行方法:刚刚获取的方法对象.invoke(实体类对象,参数) 注意:获取所有方法时(无论是否被public修饰)获取的不仅仅使在该类中定义的方法,还有该类的父类中相应的一些方法(不是全部) * 获取方法名 : String getName
反射案例
需求:写一个“框架”,可以帮助我们创建任意类的对象,并且执行其中任意方法
分析:
之前的做法:要创建一个类的对象要在main方法中new上这个类,不使用这个类了,要使用另一个类的对象时就要删除刚刚创建的对象,创建另一个类的对象。
弊端:框架的前提是不能改变框架中的代码,按照之前的做法会频繁改变之中的代码
改进实现:1、配置文件 2、反射
步骤:
1、将需要创建的对象的全类名(包名.类名)和需要执行的方法定义在配置文件中
2、在程序中加载读取配置文件
3、使用反射技术来加载类文件进入内存
4、创建对象
5、执行方法
代码实现:
ReflectTest类作为“框架”:
-
加载配置文件
(1)创建Properties对象: 用Properties加载properties对象可以形成一个集合,Properties是Map集合的子类,是一个双列集合 (2)加载配置文件转换为一个集合: 可以使用类加载器找到这个配置文件(类加载器可以找到src下的所有文件),再使用load加载该文件进入刚刚创建的properties集合(类名.class是字节码文件)
- 获取配置文件中定义的数据
- 加载要使用的类进内存
Class cls = Class.forName(className);
- 创建对象
- 获取方法对象
- 执行方法
执行结果:
如果要使用另一个类和另一个类的方法只需要修改配置文件即可:
执行结果:
优点:增加文件的可扩展性