1、Junit单元测试
软件测试分类:
●黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望值
●白盒测试:需要写代码,关注程序具体的执行流程
1.1、Junit介绍
junit是一个java语言的单元(就是方法)测试框架,属于白盒测试,简单理解为可以用于取代main方法,junit属于第三方工具,需要导入jar包后使用。
1.2、Junit的使用
- 编写测试类,简单理解为junit可以用于取代java的main方法
- 在测试类方法上添加注解@Test
- @Test修饰的方法要求:public void 方法名(){},方法名自定义建议test开头,没有参数
- 添加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接口
注解的属性
- 属性的作用:可以让用户在使用注解时传递参数,让注解的功能更加强大
- 属性的格式:
a) 格式1:数据类型 属性名();
b) 格式2:数据类型 属性名() default 默认值;
@interface MyAnnotation {
String name();//名字
int age() default 18;
String gender() default "男";
}
- 属性适用的数据类型
a) 八种基本数据类型
b) String类型,Class类型,枚举类型,注解类型
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();
}
使用注意事项:
- 如果属性有默认值,则使用注解的时候,这个属性可以不用赋值
- 如果属性没有默认值,那么在使用注解时一定要给属性赋值
特殊属性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(){
}
}
本文介绍了Junit单元测试的基本概念和使用,包括@Test、@Before和@After等常用注解,并详细讲解了注解的概述、自定义注解、元注解@Target和@Retention,以及注解的解析过程。
166

被折叠的 条评论
为什么被折叠?



