测试
1. Junit单元测试:
测试的分类:
1.黑盒测试:不需要写代码,给输入值,看程序是否能输出期望的值。
2.白盒测试:需要写代码的。关注程序具体的执行流程。
JUnit的使用:白盒测试
步骤:
1.定义一个测试类(测试用例)
建议:
测试类名:被测试的类名Test CalculatorTest
包名: xxxx.xxxx.xx.test cn.itcast.test
2.定义测试方法:可以独立运行;
建议:
方法名:test测试的方法名 testAdd()
返回值:void
参数列表:空参
3.给方法加@Test
4.导入junit依赖环境
判定结果:
红色:失败
绿色:成功
一般我们会使用断言操作来处理结果。
Assert.assertEquals(运行的预估结果,实际结果变量); //断言测试代码
2. 几个注解方法:
@Before:初始化方法:用于资源申请,所有测试方法在执行之前都会先执行该方法。
@After:释放资源方法:在所有测试方法执行完之后都会自动执行该方法。
@Test:测试方法
3. 单元测试的使用步骤:
1.定义一个测试类,在测试类中定义一些测试其他功能的方法
2.在测试方法上加一个@Test注解,同时导入Junit的依赖。
3.在此方法中,调用被测试方法,同时断言实际结果和预期结果是否一致。
如果运行是红色表示断言失败,程序运行的实际结果和预期结果不一致。
如果运行时绿色表示正常。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thBNNEPu-1622192516460)(D:%5C%E6%A1%8C%E9%9D%A2%5CDesktop%5C%E9%BB%91%E9%A9%AC%E8%A7%86%E9%A2%91%E6%B1%87%E6%80%BB%5C%E4%B8%89.web%E9%98%B6%E6%AE%B5_%E9%BB%91%E9%A9%ACweb%E9%98%B6%E6%AE%B5%E8%A7%86%E9%A2%91_32%E5%A4%A9%5Cday01_%E5%9F%BA%E7%A1%80%E5%8A%A0%E5%BC%BA%5C%E8%87%AA%E5%B7%B1%E7%9A%84%5C%E9%87%8D%E7%82%B9%E5%9B%BE%5C%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%E6%BC%94%E7%A4%BA.PNG)]
反射
1. 概述
* 反射:框架设计的灵魂
* Java代码在计算机中经历三个阶段:1.源码阶段->class文件阶段(Source源代码) 2.编译阶段 3.Runtime运行阶段。
2. 框架和反射:
* 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。
* 反射:将类的各个组成部分封装为其他对象,这就是反射机制。
3. 好处:
1. 可以在程序运行过程中,操作这些对象。
2. 可以解耦合。
* 一个类在内存中,是以对象的形式出现,Class类,class类是用来描述所有类文件的。
4. 反射的深入:
1. 成员方法:Method
2. 成员变量:Field
3. 构造方法:Constructor
* 反射就是拿到类对象,通过类对象可以获取一些类中数据:成员方法,成员变量,构造方法。
5. 获取类对象的三种方式:
1. Class.forName(全类名) //包名+类名 通过地址
// Class c1=Class.forName("it.cast.day14.Calc");
2. 类名.class 通过类
// Class c2=Calc.class;
3. 对象名.getClass 通过对象
// Calc calc=new Calc
Class c3=calc.getClass
6. Class对象功能:
1. 获取功能:
1.获取成员变量们
2.获取构造方法们
3.获取成员方法们
4.获取类名
c1.getName(获取类名)
c1.getSimpleName()获取简单类名
2. 具体:
Field类中:
set(Object o,Object value):给指定对象赋指定值。
get(Object o)获取指定对象上的对应属性值。
注意事项:
1.获取非public修饰的成员必须用加了Declared的方法。
2.在使用之前需要取消访问权限的检查。
setAccessible(true)
field.setAccessible(true); //取消访问权限的检查,也叫做暴力反射
method.invoke(对象名):调用该对象的该方法。
7. 反射的步骤原理:
1. 首先先加载类对象(字节码对象
2. 再使用构造创建对象。
3. 使用类对象名调用Method(方法),Field(变量)
4. 再进行相应的取值赋值打印等操作。
5. 总结:从大到小,从初始化到赋值等操作。
8. 框架的使用前提:不能改变框架的代码,可以创建任意类的对象,可以执行任意方法。
注解
1. 注解和注释:
* 注解:说明程序的,给计算机看的;
* 注释:用文字描述程序的,给程序员看的。
2. 定义:注解,也叫元数据。一种代码级别的说明。它是JDK1.5之后引入的一个特性,与类,接口,枚举是在同一个层次。它可以声明在包,类,方法,局部变量,等的前面。用来对这些元素进行说明,注释。
3. 文档注释:/** /
4. 作用分类:
1. 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
2. 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
3. 编译检查:通过代码里标识的注解让编译期能够实现基本的编译检查【Override】
5. JDK中预定义的一些注解:
@Override:检测该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时。
@SupperssWarnings:压制警告
一般传递参数all @SuppessWarning(“all”)
6. 自定义注解;
格式:
元注解:用于修饰注解的注解
public @interface MyAnno{
//抽象方法:属性
}
* 里面的抽象方法参数也必须是空参
本质:注解本质上就是一个接口,该接口默认继承Annotation接口。
public interface MyAnno extands java.lang.annotation.Annotation{}
7. 属性:
1. 接口中可以定义的成员方法:
要求:
1.属性的返回值类型有下列取值:
1.基本数据类型
2.String
3.枚举 enum(枚举是多例模式,有特定的几个对象)
4.注解
5.以上类型的数组
2. 定义了属性,在使用时需要给属性赋值。
1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时可以不进行属性的赋值。
2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
* 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
3. 注意事项;在注解中常量没有什么作用,我们关注的是注解中的抽象方法。
8. 元注解:基础的一共有四种,如下:
1. @Target ({ElementType.METHOD,ElementType.Field})
Target:限制注解使用的范围:
2.@ReTention:描述注解被保留的阶段
@Retention(RetentionPolicy.Runtime) SOURCE(源码阶段)RUNTIME(运行阶段)
//如果注解保留在了运行时阶段,在运行的时候可以通过反射技术获取到注解上的数据。
//如果没有保留到运行阶段,那么将无法找到该内容。
3.@Documented:描述注解是否被抽取到API文档中。 写了就可以保留到api
4.@Inherited :被修饰的注解能被子类继承。 写了就可以被子类继承
9.解析注解:
获取注解所在的成员对象。
获取对应成员上的注解的内容。
* 注意:建议最少要加两个元注解,一个是Target 和Retention
* value在属性值有多个的时候,不能省略掉value;除非在注解的时候就已经给了属性默认值。