Junit_注解_枚举

发布于:2025-07-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

一:Junit单元测试

测试分类:

(1)黑盒测试:
软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。
(2)白盒测试:—》Junit属于白盒测试。
软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序的所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试。

Junit的使用

1.一般测试和业务做一个分离,分离为不同的包
2.测试类的名字:****Test —>见名知意
3.测试方法的定义–》这个方法可以独立运行,不依托于main方法
4.测试方法定义完以后,不能直接就独立运行了,必须要在方法前加入一个注解: @Test
5.导入Junit的依赖的环境
代码可能程序上没异常但逻辑上有问题,判定结果依旧为绿色但不代表测试通过所以我们要加入断言: Assert.assertEquals()
第一个参数预测结果,第二个参数实际结果
测试类代码

public class Calclatortest {
    Calculator cal=new Calculator();
    @Test
    public void Testadd(){
        int result=cal.add(1,4);
        //加入断言:预测一下结果,判断一下我预测的结果和 实际的结果是否一致:
        Assert.assertEquals(5,result);
    }
    @Test
    public void Testsub(){
        int ans=cal.sub(5,1);
        Assert.assertEquals(4,ans);
    }
}

@Before_@After

@Before:
某一个方法中,加入了@Before注解以后,那么这个方法中的功能会在测试方法执行前先执行
一般会在@Beforer修饰的那个方法中加入一些申请资源的代码:申请数据库资源,申请IO资源,申请网络资源

@After:
某一个方法中,加入了@After注解以后,那么这个方法中的功能会在测试方法执行后先执行
一般会在@After修饰的那个方法中加入释放资源的代码:释放数据库资源,释放IO资源,释放网络资源
用法

 @Before
    public void init(){
        System.out.println("开始测试");
    }
    @After
    public void close(){
        System.out.println("结束测试");
    }

二:注解

什么是注解

1.在编译,类加载,运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
2.一定程度上可以说 :框架=注解+反射+设计模式

文档相关的注解

在这里插入图片描述
@param @return和@exception这三个标记都是只用于方法的。
@param的格式要求: @param 形参名 形参类型 形参说明
@return的格式要求: @return 返回值类型返回值说明,如果方法的返回值类型是void就不能写
@exception的格式要求: @exception 异常类型异常说明
@param和@exception可以并列多个

IDEA中的javadoc使用:

!](https://i-blog.csdnimg.cn/direct/b949c0250e82466ea0e25ca1a6682734.png)

在画圈处输入上述文字可以防止乱码

JDK内置的3个注解

1.@Override:限定重写父类方法,该注解只能用于方法
作用:限定重写的方法,只要重写方法有问题,就有错误提示。
2.@Deprecated:用于表示所修饰的元素(类,方法,构造器,属性等)已过时。通常是因为所修饰的结构危险或存在更好的选择
在方法前加入@Deprecated,这个方法就会变成一个过时方法
3.@SuppressWarnings:抑制编译器警告
作用:若编译器警告这一代码,可以加入@SuppressWarnings使其不触发警告

自定义注解

1.创建java注解
在这里插入图片描述@interface,跟接口没有一点关系
2.注解的内部: 以@SuppressWarnings为例,发现内部:
在这里插入图片描述
实际上:
value()是属性,不是方法
String[]是无参数方法(成员变量)的类型
无参数方法的类型:基本数据类型(八种),String,枚举,注解类型,还可以是以上类型对应的数组
参数叫做:配置参数
3.使用注解
如果定义了配置参数那么使用时必须给配置参数赋值
在这里插入图片描述
如果在定义配置参数时已经给其赋值了那么使用的时候无需传值
赋值操作:
在这里插入图片描述
内部没有定义配置参数的注解可以叫做标记
内部定义了配置参数的注解叫做元数据

元注解

元注解是用于修饰其它注解的注解

@Retention

作用:指定 修饰的那个注解的生命周期
@Rentention包含一个RetentionPolicy枚举类型的成员变量,使用@Rentention时必须为该value成员变量指定值:
(1)RetentionPolicy.SOURCE:在源文件中有效
(2)RetentionPolicy.CLASS:在class文件中有效,保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解
(3)RetentionPolicy.CLASS:在class文件中有效(即class保留),保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解
如果注解没有加Retention元注解,那么相当于默认的注解是.CLASS的状态

@Target

作用:被修饰的注解能用于修饰哪些程序元素

@Target也包含一个名为value的成员变量
给配置参数赋值:
1.TYPE,代表可以修饰类
2.METHOD,代表可以修饰方法
3.更多的可以去@Target的源码里面找
annotation

@Target({TYPE, METHOD})
public @interface annotation {
}

我们给配置参数复制了TYPE和METHOD使annotation注解只可以修饰类和方法,但属性和构造器不可修饰
在这里插入图片描述
注意: 记得导包

@Repeatable

作用:被该元注解修饰的注解 可以重复的修饰同一个位置

@Documented(用的很少)

作用:被该元注解修饰的注解类将被javadoc工具提取成文档。默认情况下,javadoc不包括注解

@Inherited(用的极少)

作用:如果某个类使用了被 @Inherited修饰的注解,则其子类将自动具有该注解

三:枚举

enum关键字定义枚举类

public enum Season {
	//必须将对象放在最开始的位置
    SPRING("春天","春暖花开"),
    SUMMER("夏天","烈日炎炎"),
    AUTUMN("秋天","硕果累累"),
    WINTER("冬天","冰天雪地");
	
    private final String SeasonName;//季节名称
    private final String SeasonDesc;//季节描述
	//构造器私有化,外界不能调用这个构造器,只能Season内部自己调用
    private Season(String SeasonName,String SeasonDesc){
        this.SeasonName=SeasonName;
        this.SeasonDesc=SeasonDesc;
    }

    public String getSeasonDesc() {
        return SeasonDesc;
    }
    public String getSeasonName() {
        return SeasonName;
    }
    @Override
    public String toString() {
        return "Season{" +
                "SeasonName='" + SeasonName + '\'' +
                ", SeasonDesc='" + SeasonDesc + '\'' +
                '}';
    }
}

测试类

public class Test1 {
    public static void main(String[] args) {
        Season winter = Season.WINTER;
        System.out.println(winter);
    }
}

SPRING(“春天”,“春暖花开”),
SUMMER(“夏天”,“烈日炎炎”),
AUTUMN(“秋天”,“硕果累累”),
WINTER(“冬天”,“冰天雪地”);

这样写省略了public static final Season SPRING = new Season(“春天”,“春暖花开”);

我们可以看到 Season类中重写了toString方法所以我们输出的结果是
在这里插入图片描述
现在我们将Season类中的同String方法去掉
依旧运行Test类输出的结果是
在这里插入图片描述
因为enum的上层父类不是Object而是java.lang.Enum

Enum;类的常用方法

1.toString():获取对象的名字
2.values: 返回枚举类对象的数组
3.valueOf:通过对象名字获取这个枚举对象

枚举类实现接口

接口

public interface ii {
    void show();
}

Season类

public enum Season implements ii{
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;

    @Override
    public void show() {
        System.out.println("这是春天");
    }
}

Test类

public class Test {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        spring.show();
        Season winter = Season.WINTER;
        winter.show();
    }
}

输出结果:
在这里插入图片描述

我们发现上面 所有的枚举对象,调用这个show方法的时候走的都是同一个方法,结果都一样
我们想要不同的对象调用的show方法不同
改进后的Season类

public enum Season implements ii{
    SPRING{
        public void show() {System.out.println("这是春天");}
    },
    SUMMER {
        public void show() {System.out.println("这是夏天");}
    },
    AUTUMN {
        public void show() {System.out.println("这是春秋天");}
    },
    WINTER {
        public void show() {System.out.println("这是冬天");}
    };
}

这样子就可以达到我们的目的

枚举的应用

1.可以在入口处对参数进行限制
例如:性别只有“男”和“女”种,所以我们可以使用enum来对设置性别的参数进行限制
Person类

public class Person {
    private Gender sex;

    public Gender getSex() {
        return sex;
    }
    public void setSex(Gender sex) {
        this.sex = sex;
    }
}

Gender类

public enum Gender {,;
}

Test类
在这里插入图片描述在这里插入图片描述
我们发现只要set方法传入的不是“男”或”女“就会报错


网站公告

今日签到

点亮在社区的每一天
去签到