Junit单元测试、注解

本文介绍了Junit单元测试的基本概念和使用,包括@Test、@Before和@After等常用注解,并详细讲解了注解的概述、自定义注解、元注解@Target和@Retention,以及注解的解析过程。

1、Junit单元测试

软件测试分类:

●黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望值

●白盒测试:需要写代码,关注程序具体的执行流程

1.1、Junit介绍

junit是一个java语言的单元(就是方法)测试框架,属于白盒测试,简单理解为可以用于取代main方法,junit属于第三方工具,需要导入jar包后使用。

1.2、Junit的使用

  1. 编写测试类,简单理解为junit可以用于取代java的main方法
  2. 在测试类方法上添加注解@Test
  3. @Test修饰的方法要求:public void 方法名(){},方法名自定义建议test开头,没有参数
  4. 添加junit jar包到lib文件夹中,然后进行jar包关联
    在这里插入图片描述

1.3、常用注解

@Test,用于修饰要执行的测试方法

@Before,修饰的方法会在测试方法之前被自动执行,常用来在测试时进行数据的初始化工作

@After,修饰的方法会在测试方法执行后自动被执行,常用来在测试时进行资源的销毁

package com.bdit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/*
Junit单元测试
 */
public class Demo1 {

    @Test
    public void testPrint1(){
        System.out.println("junit单元测试");
    }

    @Before
    public void testBefore(){
        System.out.println("=========初始化==============");
    }

    @After
    public void testAfter(){
        System.out.println("==========销毁资源==========");
    }
}

1.4、IDEA导出JAR包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
jar包的运行命令:java –jar xxx.jar

2、注解

2.1、注解概述

注解(Annotation),也叫元数据(元数据:就是用来描述数据的数据)。一种代码级别的说明,它是JDK1.5及其以后版本引入的一个特征,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明。作用分类:

● 编写文档:通过代码里标识的注解生成文档

●代码分析:通过代码里标识的注解对代码进行分析

●编译检查:通过代码标识里的注解让编译器能够实现基本的编译检查【@Override】

2.2、自定义注解

定义格式:

public @interface 注解名称{  
	 属性列表;
}

注解本质上就是一个接口,该接口默认继承了Annotation接口

注解的属性

  1. 属性的作用:可以让用户在使用注解时传递参数,让注解的功能更加强大
  2. 属性的格式:
    a) 格式1:数据类型 属性名();
    b) 格式2:数据类型 属性名() default 默认值;
@interface MyAnnotation {     
	String name();//名字    
	int age() default 18;    
	String gender() default "男";
}
  1. 属性适用的数据类型
    a) 八种基本数据类型
    b) String类型,Class类型,枚举类型,注解类型

2.3、使用自定义注解

在程序中使用注解的步骤:

  1. 获取注解定义的位置对象
  2. 获取指定的注解
  3. 调用注解中的抽象方法获取配置的属性值
package com.bdit;

import java.lang.annotation.Annotation;

/**
 * @PackageName : com.bdit
 * @Author : Administrator
 * @Date :2019/11/26 15:34
 * @Description :
 */
public class Demo8 {
    @Person(name="张三")
    public void showPerson(){

    }
}
@interface Person {

    String name();//名字
    int age() default 18;
    String gender() default "男";
    String[]info();
}

使用注意事项:

  1. 如果属性有默认值,则使用注解的时候,这个属性可以不用赋值
  2. 如果属性没有默认值,那么在使用注解时一定要给属性赋值
特殊属性Value

1、 当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是普通类型还是数组类型。

@interface Book{
    //书名
    String value();
}
    @Book("java基础")
    public void showPerson(){

    }

2、 如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时,value属性名不能省略

@interface Book{
    //书名
    String value();
    //价格
    double price();
}
    @Book(value="java基础",price =99.6)
    public void showPerson(){

    }

2.4、注解中的元注解

默认情况下,注解可以用在任何地方,比如类、成员方法、构造方法、成员变量等地方。如果要限制注解的使用位置,就可以通过元注解来实现。

元注解之@Target

作用:指明此注解用在哪个位置,如果不写默认是任何地方都可以使用

可选的参数值在枚举类ElementType中包括:
(1) TYPE:用在类,接口上
(2) FIELD:用在成员属性上
(3) METHOD:用在方法上
(4) PARAMTER:用在参数上
(5) CONSTRUCTOR:用在构造方法上
(6) LOCAL_VARIABLE:用在局部变量上

元注解之@Retention

作用:定义该注解的生命周期(有效范围)

可选参数值在枚举类:RetentionPolicy中包括:
(1) SOURCE:注解只存在与java源代码中,编译生成的字节码文件就不存在
(2)CLASS:注解存在于java源码中、编译以后的字节码文件中,运行的时候内存中没有,默认
(3)RUNTIME:注解存在与Java源码中、编译后的字节码文件中、运行时内存中,程序可以通过反射获取该注解

package com.bdit;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @PackageName : com.bdit
 * @Author : Administrator
 * @Date :2019/11/26 15:59
 * @Description :
 */
@Stu(name="zhangsan")
public class Demo9 {

    String name;
    @Stu(name="小明")

    public void display(){

    }
}
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
@interface Stu{
    String name();
}

2.5、注解的解析

注解解析就是通过java技术获取注解数据的过程。

与注解解析相关的接口

●Annotation:所有注解类型的公共接口,类似所有类的父类是Object

●AnnotatedElement:定义了与注解解析相关的方法

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):判断当前对象是否有指定的注解,有则返回true,没有返回false
T getAnnotation(Class<T> annotationClass):获得当前对象上指定的注解对象
Annotation[]getAnnotations():获得当前对象及其从父类上继承的所有注解对象
Annotation[]getDeclaredAnnotations():获得当前对象上所有的注解对象,不包括父类的

●如果注解作用在方法上,就通过方法(Method)对象得到它的注解

Method method=clazz.getDeclaredMethod(“方法名”);
Book book=method. getAnnotation(Book.class)

●如果注解作用在类上,就通过Class对象得到

Class c1=类名.class;
Book book=c1.getAnnotation(Book.class);
使用反射获取注解的数据
package com.bdit;

import org.junit.Test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @PackageName : com.bdit
 * @Author : Administrator
 * @Date :2019/11/26 16:14
 * @Description :
 */
public class Demo10 {

    /*
    解析类注解
     */
    @Test
    public void test01(){
        //获得StudentTest类对应的Class对象
        Class c=StudentTest.class;
        //判断StudentTest类是否使用了Students注解
        if(c.isAnnotationPresent(Students.class)){
            //根据注解Class对象获取注解对象
            Students students=(Students) c.getAnnotation(Students.class);
            //输出注解属性值
            System.out.println("姓名:"+students.value());
            System.out.println("年龄:"+students.age());
            System.out.println("地址:"+ Arrays.toString(students.address()));
        }
    }

    /*
    解析方法注解
     */
    @Test
    public void test02() throws NoSuchMethodException {
        //获得StudentTest类对应的Class对象
        Class c=StudentTest.class;
        //获取成员方法对应的Method对象
        Method m=c.getMethod("display");
        //判断StudentTest类是否使用了Students注解
        if(m.isAnnotationPresent(Students.class)){
            Students students=(Students) m.getAnnotation(Students.class);
            //输出注解属性值
            System.out.println("姓名:"+students.value());
            System.out.println("年龄:"+students.age());
            System.out.println("地址:"+ Arrays.toString(students.address()));
        }
    }
}
/*
注解Studetns
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Students{
    //姓名
    String value();
    //年龄
    int age() default 18;
    //地址
    String[] address();
}
/*
使用注解
 */
@Students(value = "张三",address = {"山东","聊城"},age = 22)
class StudentTest{

    @Students(value = "小明",address = {"北京"})
    public void display(){

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值