junit单元测试框架,反射,注释,动态代理

1,junit单元测试框架

单元测试:

就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试

之前进行单元测试,问题

只能在main方法编写测试代码,去调用其他方法进行测试

无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试

无法得到测试的报告,需要程序员自己去观察测试是否成功

可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)

优点:

可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立

不需要程序员去分析测试的结果,会自动生成测试报告出来

使用步骤:

1,将Junit框架的jar包导入到项目中(注意:IDEA集成了Junit框架,不需要我们自己手工导入了)

2,为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)

3,测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试

4,开始测试:选中测试方法,右键选择“JUnit运行”,如果测试通过,则是绿色;如果测试失败,则是红色

Junit单元测试框架的常用注解(Junit 4.xxxx版本)

注解说明
@Test测试类中的方法必须用它修饰才能成为测试方法,才能启动执行
@Before(junit5----------@BeforeEach)用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次

@After(junit5-----------

@AfterEach)

用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次

@BeforeClass(junit5--------

@BeforeAll)

用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次
@AfterClass(junit5----------@AfterAll)用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次

在测试方法执行前执行的方法,常用于:初始化资源

在测试方法执行完后再执行的方法,常用于:释放资源

2,反射

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)

反射学什么?

获取类的信息,操作它们

1、反射第一步:加载类,获取类的字节码:Class对象

获取Class对象的三种方式

class c1=类名.class

调用Class提供方法:public static class forName(String package);

Object提供的方法: public Class getClass(); Class c3=对象.getClass();

        Class c1=Student.class;

        Class c2=Class.forName("com.add.Student");
        System.out.println(c1==c2);//true
        
        Student s=new Student();
        Class c3=s.getClass();

2、获取类的构造器:Constructor对象

Class提供了从类中获取构造器的方法

方法说明
Constructor<?>[]getConstructors()获取全部构造器(只能获取public修饰的)
Constructor<?>[] getDeclaredConstructors()获取全部构造器(只要存在就能拿到)
Constructor<T> getConstructor(class<?>... parameterTypes)获取某个构造器(只能获取public修饰的)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)获取某个构造器(只要存在就能拿到)

 获取类构造器的作用:依然是初始化一个对象返回

Constructor提供的方法说明
T newInstance(Object. . . initargs)调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)

3、获取类的成员变量:Field对象

Class提供了从类中获取成员变量的方法

方法说明
public Field[] getFields()获取类的全部成员变量(只能获取public修饰的)
public Field[] getDeclaredFields()获取类的全部成员变量(只要存在就能拿到)
public Field getField(String name)获取类的某个成员变量(只能获取public修饰的)
public Field getDeclaredField(String name)获取类的某个成员变量(只要存在就能拿到)

获取到成员变量的作用:依然是赋值、取值。

方法说明
void set(Object obj, Object value) :赋值
object get(Object obj)取值
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)

4、获取类的成员方法:Method对象

Class提供了从类中获取成员方法的API

方法说明
Method[] getMethods()获取类的全部成员方法(只能获取public修饰的)
Method[] getDeclaredMethods()获取类的全部成员方法(只要存在就能拿到)
Method getMethod(String name,class<?>... parameterTypes)获取类的某个成员方法(只能获取public修饰的)
Method getDeclaredMethod(string name,class<?>... parameterTypes)获取类的某个成员方法(只要存在就能拿到)

成员方法的作用:依然是执行

Method提供的方法说明
public Object invoke(Object obj, Object. . . args)触发某个对象的该方法执行
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)

反射的作用:

1,基本作用:可以得到一个类的全部成分然后操作

2,可以破坏封装性

3,最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能

3,注解

注解:就是Java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序

(1)自定义注解

就是自己定义注解

public @interface 注解名称{
    public 属性类型 属性名() default 默认值;
}

特殊属性名: value

如果注解中只有一个value属性,使用注解时,value名称可以不写!!

public @interface MyTest1 {
    String aaa();
    boolean bbb() default true;
    String[] ccc();
}


@MyTest1(aaa="一花一世界",ccc={"AE","AD"})
public class AnnotationTest1 {
    @MyTest1(aaa="湫",bbb=false,ccc={"KKK","aD"})
    public void test1(){

    }
}

 (2)元注解

指的是:修饰注解的注解

1)@Target

作用:声明被修饰的注解只能在哪些位置使用

@Target(ElementType.TYPE)

1.TYPE,类,接口

2.FIELD,成员变量

3.METHOD,成员方法

4.PARAMETER,方法参数

5. CONSTRUCTOR,,构造器

6. LOCAL_VARIABLE,局部变量

2)@Retention

作用:声明注解的保留周期

@Retention(RetentionPolicy .RUNTIME)

1.SOURCE

只作用在源码阶段,字节码文件中不存在

2. CLASS(默认值)

保留到字节码文件阶段,运行阶段不存在

3.RUNTIME(开发常用)

一直保留到运行阶段

(3)注解的解析

什么是注解的解析?

就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解?

1,指导思想;要解析谁上面的注解,就应该先拿到谁

2,比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解

3,比如要解析成员方法上的注解,则应该获到该成员方法的Method对象。再通过Method对象解析其上面的注解

4,比如要解析成员方法上的注解,则应该获到该成员方法的Method对象。再通过Method对象解析其上面的注解

5,Class ,Method ,Field , Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力

Annotated Element接口提供了解析注解的方法说明
public Annotation[] getDeclaredAnnotations()获取当前对象上面的注解
public T getDeclaredAnnotation(class<T> annotationclass)获取指定的注解对象
public boolean isAnnotationPresent(Class<Annotation> annotationclass)判断当前对象上是否存在某个注解

4,动态代理

程序为什么需要代理?代理长什么样?

对象如果赚身上干的事太多的话,可以通过代理来转移部分职责

对象有什么方法想被代理,代理就一定要有对应的方法

中介如何知道要派有唱歌、跳舞方法的代理呢?

接口

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值