单元测试、注解

目录

一、单元测试

单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法。因此,单元测试就是针对Java方法的测试,进而检查方法的正确性。

可以测试的方法必须是公共的无参数无返回值的非静态方法。

需要用到Junit单元测试框架。

1.快速入门

这是我们写的进行测试的方法。@Test这个注解表示当前方法可以通过单元测试来进行测试。

点击绿色箭头,如果方法成功通过,则会有以下结果。

2.Junit在实际开发中的用法

以后在实际开发中,如果想要测试一个方法是否正确,并不是直接在当前方法的上面写@Test。而是独立编写一个测试类。在这个类中,编写一些方法,在方法里面调用要被测试的方法即可。

见下面代码,在测试方法的前面有一个注解@Before的方法,在后面有一个直接@After的方法。

java 复制代码
public class JunitDemo2 {

    @Before
    public void beforeMethod() {
        System.out.println("before");
    }

    @Test
    public void method() {
        System.out.println("Test");
    }

    @After
    public void afterMethod() {
        System.out.println("after");
    }

}

可以发现,@Before在测试方法之前执行了一次,@After在测试方法之后执行了一次。

需求:测试File类中delete方法是否书写正确。

因为要测试delete方法,因此执行该方法可能会导致文件被删除。所以我们要在@Before方法中对文件进行备份,然后测试完之后,要在@After方法中恢复文件(a.txt),并删除备份文件(copy.txt)。

java 复制代码
public class JunitDemo3 {

    //测试代码不可以污染源数据,即不可以对源数据有任何的修改
    //例如要对一个文件进行操作,不可以对文件的内容进行修改,也不可以导致文件被删除

    //1.利用Before去对数据做一个初始化的动作
    //2.利用Test真正的去测试方法
    //3.利用After去还原数据

    //需求:测试File类中delete方法是否书写正确
    //如果我们直接在测试方法中去运行file.delete方法,可能会导致被测试的文件直接被删除

    @Before
    public void beforeMethod() throws IOException {
        //进行备份
        FileInputStream fis = new FileInputStream("C:\\Users\\lenovo\\IdeaProjects\\basic-code\\day34\\a.txt");
        //将源数据拷贝一份
        FileOutputStream fos = new FileOutputStream("C:\\Users\\lenovo\\IdeaProjects\\basic-code\\day34\\copy.txt");

        int b;
        while ((b = fis.read()) != -1) {
            fos.write(b);
        }

        fos.close();
        fis.close();
    }


    
    @Test
    public void method() {
        /*
            在这个方法中对File类中delete方法进行测试
         */
        File file = new File("C:\\Users\\lenovo\\IdeaProjects\\basic-code\\day34\\a.txt");
        boolean b = file.delete();

        //检查a.txt是否存在
        boolean exists = file.exists();

        //断言
        Assert.assertEquals("delete方法出错", b, true);
        Assert.assertEquals("exists方法出错", exists, true);


    }

    @After
    public void afterMethod() throws IOException {
        File file = new File("C:\\Users\\lenovo\\IdeaProjects\\basic-code\\day34\\copy.txt");
        //恢复数据
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream("C:\\Users\\lenovo\\IdeaProjects\\basic-code\\day34\\a.txt");

        //将拷贝的数据恢复成源文件
        int b;
        while ((b = fis.read()) != -1) {
            fos.write(b);
        }

        fos.close();
        fis.close();

        //最后将备份数据删除
        file.delete();

    }

}

二、注解

1.注解概述

注解的主要作用:对我们的程序进行标注。通过注解可以给类增加额外的信息。

注解是给编译器或JVM看的,可以根据注解来完成对应的功能。

@Override表示该方法是重写的方法,@Deprecated表示该方法已经过时,@SuppressWarnings("all")可以去掉警告信息,即代码底下的黄线。


2.自定义注解

自定义注解单独存在是没有什么意义的,一般会跟反射结合使用,会用反射去解析注解。


这是注解的代码:

java 复制代码
public @interface MyAnno {
    public String name();

    public int age();
}

这是使用自定义注解的代码,如果没有给默认值,则要手动赋值。

java 复制代码
@MyAnno(name = "wuhan", age = 137)
public class MyAnnoDemo1 {

    String name;
    String age;

    public void method() {
        System.out.println("method");
    }
}

3.元注解


可以发现,图中右边的注解被约束只能定义在方法上,所以左边定义在类上的注解就报错了。

4.解析注解

有以下的需求:

注解代码如下:

java 复制代码
//表示我们的注解只能写在方法上面
@Target(ElementType.METHOD)
//表示着我们的注解可以再任意时期都存在
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

}

类代码如下:

java 复制代码
public class MyTestDemo {

    @MyTest
    public void method() {
        System.out.println("method");
    }

    public void method1() {
        System.out.println("method1");
    }

    public void method2() {
        System.out.println("method2");
    }
}

测试类:

java 复制代码
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取类的class对象
        Class<?> clazz = Class.forName("annotataiondemo1.MyTestDemo");

        MyTestDemo mtd = (MyTestDemo) clazz.newInstance();

        //获取所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            //判断当前方法上面有没有MyTest注解
            if (method.isAnnotationPresent(MyTest.class)) {
                method.invoke(mtd);
            }
        }


    }
}

只有method方法上有注解,所以只有method方法执行了。

相关推荐
李白的粉5 分钟前
基于ssm的电子病历系统(全套)
java·毕业设计·ssm·课程设计·源代码·基于ssm的电子病历系统
小九没绝活20 分钟前
设计模式-适配器模式
java·设计模式·适配器模式
希忘auto1 小时前
Spring Cloud之负载均衡之LoadBalance
java·spring cloud
川石课堂软件测试1 小时前
涨薪技术|Kubernetes(k8s)之Pod环境变量
java·功能测试·docker·云原生·容器·kubernetes·单元测试
ん贤1 小时前
【数据结构】栈与队列:基础 + 竞赛高频算法实操(含代码实现)
java·数据结构·c++·算法
啾啾Fun1 小时前
[设计模式与源码]1_Spring三级缓存中的单例模式
java·后端·spring·解耦·三级缓存·源码中的单例模式·依赖解耦
小九没绝活1 小时前
设计模式-建造者模式
java·设计模式·建造者模式
forestsea1 小时前
Java 8 Stream API:传统实现和流式编程的范式对比
java·开发语言
tan_jianhui1 小时前
用maven生成springboot多模块项目
java·spring boot·maven
多多*1 小时前
Spring设计模式 八股速记 高层模块底层模块 依赖倒置原则 开闭原则 接口隔离原则
java·开发语言·数据库·macos·github·objective-c·cocoa