今天开始学java(十八)Junit单元测试、反射与注解(好日子来临罢!)

Junit单元测试:
测试分类:
1、黑盒测试:不需要写代码,给输入值,看程序是否能输出期望值
2、白盒测试:需要写代码,关注程序具体执行流程。

Junit使用:白盒测试使用
	步骤:
	1、定义一个测试类(测试用例)
		建议:
			测试类名:被测试的类名后加上Test 
			包名:xxx.xxx.xx.test
			
	2、定义测试方法:可以独立运行
		建议:
			方法名:test测试的方法名	例子`testadd()`
			返回值:void,没有返回值,因为结果自己看就好了,没必要写返回值所以写void
			参数列表:空参
			
	3、给方法加注解@Test
		加上@Test方法即可独立运行
		
	4、导入Junit依赖包
	
判定结果:
红色失败,绿色成功
	一般使用断言操作来处理结果
	例子:`Assert.assertEquals(期望的结果,运算的结果);` 
	
补充:
@Before:修饰的方法会在测试方法之前被自动执行,一般用于资源的申请
@After:修饰的方法会在测试方法执行之后自动被执行,一般用于资源的释放
    @Before
    public void init(){
        System.out.println("init...");
    }
    
    @After
    public void close(){
        System.out.println("close。。。(`ヮ´ )");
    }

    @Test
    public void testAdd(){
        jisuanqi c = new jisuanqi();
        int result = c.add(1, 2);
        System.out.println("testAdd...");
        Assert.assertEquals(4,result);
    }

输出的结果为:

init...
testadd
close。。。(`ヮ´ )

反射

框架设计的灵魂,反射就是将一个类的组成部门封装成为其他对象,获取和操作这些项时,最关键的是要获取class类对象
框架:半成品软件。可以在框架的基础上进行软件的开发,简化编码
	反射机制:将类的各个组成部分封装为其他对象
		好处:1、在程序运行过程中,操作这些对象。
			  2、可以解耦,降低程序的耦合性,来提高程序的可扩展性

获取class对象的方式:
1、class.forName("全类名"):将字节码文件加载进内存,返回class对象
	*多用于配置文件,将类名定义在配置文件中,读取文件,加载类 
2、类名.class:通过类名的属性class来获取
	*多用于参数的传递
3、对象.getClass():getClass()在object类中定义着
	*多用于对象的获取字节码的方式
	
同一个字节码文件(*.class)在一次运行过程中,只会被加载一次,无论通过哪一种方式获取的class对象都是同一个

Class对象功能:
	*获取功能:
		1、获取成员变量们
		`getFields()`
		2、获取构造方法们
		3、获取成员方法们
		4、获取类名称
		获取。。

	反射技术的案例:
	需求:写一个“框架”,不改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法。
	步骤:1、将需要创建的对象的全类名和需要执行的方法定义在配置文件中
		  2、在程序中加载读取配置文件
		  3、使用反射技术来加载类文件进内存
		  4、创建对象
		  5、执行方法

注解:说明程序,给计算机看的

JDK中预定义的一些内置注解
@Override :检测被该注解标注的方法是否是继承自父类的
@Oeprecated :将该注解标注的内容,表示已过时
@SuppressWarning :压制警告,一般写在类的开头,传入的参数可以消除类中的警告,例如:@SuppressWarning(“all”)

自定义注解

格式:
	元注解
	public @interface 注解名称{}
本质:注解本质就是一个借口,该接口默认继承Annotation接口
属性:接口中可以定义的成员方法(抽象方法)
	要求:属性的返回值类型
		*基本数据类型 public abstract int show1();
		*String		String show2();//可以省略public abstract
		*枚举		创建一个枚举类,public enum Person{p1,p2;} Person per;
		*注解
		*以上类型的数组
	如果自定义的注解需要赋值,则需要在使用注解时赋值,如使用默认值,需要在定义时后面加default,例如`String name() default "bate";`
	
	如果只有一个属性需要赋值,并且属性的名称叫value,可以在使用注解时直接定义值。

元注解

用于描述注解的注解就是元注解哈哈哈哈哈哈
@Target:描述注解能够作用的位置,如果想及作用与方法、类、成员变量上的话需要在加@Target标签时value中添加对应的取值范围`@Target({ElementType.TYPE})`
	ElementType取值:
		TYPE:可以用作于类上
		METHOD:可以用作于方法上
		FIELE:可以用作于成员变量上
@Retention:描述注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承

解析注解:获取注解中定义的属性值

1、获取注解定义的位置的对象(Class,Method,Field)
2、获取指定的注解
3、调用注解的抽象方法获取配置的属性值

总结:
1、大多数时候我们会使用注解,而不是自定义注解
2、注解一般只在编译器和解析程序使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章