Day20-【Java SE高级】单元测试 反射 注解 动态代理

这篇具有很好参考价值的文章主要介绍了Day20-【Java SE高级】单元测试 反射 注解 动态代理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、单元测试

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

1. 咱们之前是如何进行单元测试的?有啥问题?

  • 只能在main方法编写测试代码,去调用其他方法进行测试。
  • 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试。
  • 无法得到测试的报告,需要程序员自己去观察测试是否成功。

2. Junit单元测试框架

  • 可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了Junit框架,比如IDEA)
2.1 优点
  • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立.
  • 不需要程序员去分析测试的结果,会自动生成测试报告出来。
2.2 快速入门

需求:某个系统,有多个业务方法,请使用Junit单元测试框架,编写测试代码,完成对这些方法的正确性测试。
具体步骤

  • 将Junit框架的jar包导入到项目中(注意:IDEA集成了Junit框架,不需要我们自己手工导入了)
  • 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)
  • 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试;
  • 开始测试:选中测试方法,右键选择“JUnit运行”,如果测试通过则是绿色;如果测试失败,则是红色

可以右键模块,run all test自动化一键测试,可以点击测试类的运行运行该类的所有自动化测试。

package com.jingwei;

import org.junit.Assert;
import org.junit.Test;

public class StringUtilTest {
    @Test
    public void testPrintNumber(){
        StringUtil.printNumber("admin");
        StringUtil.printNumber(null);
    }
    @Test
    public void testGetMaxIndex(){
        int maxIndex = StringUtil.getMaxIndex(null);
        System.out.println(maxIndex);

        int maxIndex1 = StringUtil.getMaxIndex("admin");
        System.out.println(maxIndex1);

        //断言机制:程序员可以通过预测业务方法的结果
        Assert.assertEquals(4,maxIndex1);
    }
}

package com.jingwei;

public class StringUtil {
    public static void printNumber(String name) {
        if(name==null){
            System.out.println("名字长度是:" +0);
            return;
        }
        System.out.println("名字长度是:" + name.length());
    }

    //求字符串的最大索引
    public static int getMaxIndex(String data) {
        if (data == null) {
            return -1;
        }
        return data.length()-1;
    }
}

2.3 常用注解

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

package com.jingwei;

import org.junit.*;

import java.net.Socket;

public class StringUtilTest {
    private Socket socket;
    private static Socket  socket1;
    @Before
    public void setUp() throws Exception {
        System.out.println("--->Setup Before 测试配置文件执行了---------");
        socket = new Socket("127.0.0.1", 8888);
    }
    @After
    public void setUp1() throws Exception {
        System.out.println("--->Setup After 测试配置文件执行了---------");
        socket.close();
    }
    @BeforeClass
    public static void setUp2() throws Exception {
        System.out.println("--->Setup BeforeClass 测试配置文件执行了---------");
        socket1=new Socket("127.0.0.1", 8888);
    }
    @AfterClass
    public static void setUp3() throws Exception {
        System.out.println("--->Setup AfterClass 测试配置文件执行了---------");
        socket1.close();
    }

    @Test
    public void testPrintNumber(){
        StringUtil.printNumber("admin");
        StringUtil.printNumber(null);
    }

    @Test
    public void testGetMaxIndex(){
        int maxIndex = StringUtil.getMaxIndex(null);
        System.out.println(maxIndex);

        int maxIndex1 = StringUtil.getMaxIndex("admin");
        System.out.println(maxIndex1);

        //断言机制:程序员可以通过预测业务方法的结果
        Assert.assertEquals(4,maxIndex1);
    }
}

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

二、反射

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

2.1 反射(Reflection)

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。
Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

2.2 反射学什么?

学习获取类的信息、操作它们
1、反射第一步:加载类,获取类的字节码:Class对象
2、获取类的构造器:Constructor对象
3、获取类的成员变量:Field对象
4、获取类的成员方法:Method对象
全部认识完后,再看反射的应用场景

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

package com.reflect;

public class ReflectTest1 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class studentClass = Student.class;
        System.out.println(studentClass.getName());
        System.out.println(studentClass.getSimpleName());

        Class aClass = Class.forName("com.reflect.Student");
        System.out.println(aClass.getName());

        System.out.println(studentClass == aClass);

        Class tom = new Student("Tom",11).getClass();
        System.out.println(tom.getName());
        System.out.println(tom==studentClass);
    }
}

class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2.3 获取类的构造器

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

package com.reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class ReflectTest2 {
    @Test
    public void testGetConstructors() {
        //1. 反射第一步:必须先得到这个类的class对象
        Class<Student> studentClass = Student.class;
        //2. 获取类的全部构造器
//        Constructor[] constructors = studentClass.getConstructors();
        Constructor[] constructors = studentClass.getDeclaredConstructors();
        //3. 遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "--->"
                    + constructor.getParameterCount());
        }

    }

    @Test
    public void testGetConstructor() throws NoSuchMethodException {
        Class<Student> studentClass = Student.class;
//        Constructor<Student> constructor = studentClass.getConstructor();
        Constructor constructor = studentClass.getDeclaredConstructor();
        System.out.println(constructor.getName() + "--->"
                + constructor.getParameterCount());

        Constructor constructor1 = studentClass.getDeclaredConstructor(String.class,int.class);
        System.out.println(constructor1.getName() + "--->"
                + constructor1.getParameterCount());
    }
}

获取类构造器的作用:依然是初始化一个对象返回
Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

package com.reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectTest2 {
    @Test
    public void testGetConstructors() {
        //1. 反射第一步:必须先得到这个类的class对象
        Class<Student> studentClass = Student.class;
        //2. 获取类的全部构造器
//        Constructor[] constructors = studentClass.getConstructors();
        Constructor[] constructors = studentClass.getDeclaredConstructors();
        //3. 遍历数组中的每个构造器对象
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName() + "--->"
                    + constructor.getParameterCount());
        }

    }

    @Test
    public void testGetConstructor() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<Student> studentClass = Student.class;
//        Constructor<Student> constructor = studentClass.getConstructor();
        Constructor constructor = studentClass.getDeclaredConstructor();
        System.out.println(constructor.getName() + "--->"
                + constructor.getParameterCount());
        constructor.setAccessible(true);//禁止检查访问权限,可以访问私有构造器,破坏封装性能
        Student o = (Student) constructor.newInstance();
        System.out.println(o);


        Constructor constructor1 = studentClass.getDeclaredConstructor(String.class, int.class);
        System.out.println(constructor1.getName() + "--->"
                + constructor1.getParameterCount());
        Student o1 = (Student) constructor1.newInstance("叮当猫", 3);
        System.out.println(o1);
    }
}

2.3 获取类的成员变量

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

    @Test
    public void testGetField() throws NoSuchFieldException, IllegalAccessException {
        //1. 反射第一步:必须是先得到类的Class对象
        Class<Student> studentClass = Student.class;
        //2. 获取类的全部成员变量。
        Field[] fields = studentClass.getDeclaredFields();
        //3. 遍历这个成员变量数组
        for (Field field : fields) {
            System.out.println(field.getName() + "--->"+field.getType());
        }
        //4. 定位某个成员变量
        Field declaredField = studentClass.getDeclaredField("name");
        System.out.println(declaredField.getName()+"--->"+declaredField.getType());

        Field age = studentClass.getDeclaredField("age");
        System.out.println(age.getName()+"--->"+age.getType());

        //赋值
        Student student = new Student();
        declaredField.setAccessible(true);
        declaredField.set(student,"加菲猫");
        System.out.println(student);

        //取值
        String rs = (String) declaredField.get(student);
        System.out.println(rs);
    }

2.4 获取类的成员方法

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j
Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j

    @Test
    public void testGetMethod() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<Student> studentClass = Student.class;
        Method[] methods = studentClass.getDeclaredMethods();
        System.out.println("所有成员方法如下:");
        for (Method method : methods) {
            System.out.println(method.getName() + "--->"+method.getParameterCount()
            +"--->"+method.getReturnType());
        }
        System.out.println("---------");
        Method declaredMethod = studentClass.getDeclaredMethod("setName", String.class);
        System.out.println(declaredMethod.getName()+"--->"+declaredMethod.getParameterCount()
        +"--->"+declaredMethod.getReturnType());

        System.out.println("---------");
        Method declaredMethod1 = studentClass.getDeclaredMethod("getName");
        System.out.println(declaredMethod.getName()+"--->"+declaredMethod.getParameterCount()
                +"--->"+declaredMethod.getReturnType());

        Student student = new Student("Tom", 12);
        String invoke = (String) declaredMethod1.invoke(student);
        System.out.println(invoke);

        Object invoke1 = declaredMethod.invoke(student, "Mike");
        System.out.println(invoke1);
        System.out.println(student.getName());
    }

2.5 作用、应用场景

反射的作用?

  • 基本作用:可以得到一个类的全部成分然后操作。
  • 可以破坏封装性。
  • 最重要的用途是:适合做lava的框架,基本上,主流的框架都会基于反射设计出一些通用的功能,

Day20-【Java SE高级】单元测试 反射 注解 动态代理,JAVA从入门到放弃,java,单元测试,log4j文章来源地址https://www.toymoban.com/news/detail-854874.html

    @Test
    public void saveInfo() throws IOException, IllegalAccessException {
        People tom = new People("Tom", 12);
        Teacher mike = new Teacher("Mike", 21, 22, "123456789");

        //需求:把任意对象的字段名和其对应的值等信息,保存到文件中去
        ObjectFrame.saveInfo(tom);
        ObjectFrame.saveInfo(mike);
    }
package com.reflect;

import java.io.*;
import java.lang.reflect.Field;

public class ObjectFrame {
    //需求:把任意对象的字段名和其对应的值等信息,保存到文件中去
    public static void saveInfo(Object o) throws IllegalAccessException, IOException {
        PrintStream printStream = new PrintStream(new FileOutputStream("src/com/reflect/info.txt", true));
        Class<?> aClass = o.getClass();
        String simpleName = aClass.getSimpleName();
        printStream.println("-------------------------------"+simpleName+"--------------------------------");
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldName = field.getName();
            String value = field.get(o)+"";
            System.out.println(fieldName + ":" + value);
            printStream.println(fieldName + "=" + value);
        }
    }
}

到了这里,关于Day20-【Java SE高级】单元测试 反射 注解 动态代理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java SE 学习笔记(十七)—— 单元测试、反射

    开发好的系统中存在很多方法,如何对这些方法进行测试? 以前我们都是将代码全部写完再进行测试。其实这样并不是很好。在以后工作的时候,都是写完一部分代码,就测试一部分。这样,代码中的问题可以得到及时修复。也避免了由于代码过多,从而无法准确定位到错误

    2024年02月06日
    浏览(36)
  • 单元测试&反射&注解

             就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。             可以用来对方法进行测试,它是由Junit公司开源出来的            反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。             

    2024年02月07日
    浏览(28)
  • Java SE 学习笔记(十八)—— 注解、动态代理

    Java 注解(Annotation)又称Java标注,是JDK 5.0引入的一种注释机制,Java语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注,至于到底做何种处理由业务需求来决定。 例如: JUnit 框架中,标记了注解 @Test 的方法就可以被当成测试方法执行,而没有标记的就不

    2024年02月08日
    浏览(23)
  • 面向对象(高级)-Annotation注解、单元测试的使用

    注解大纲 什么是注解 注解(Annotation)是从 JDK5.0 开始引入,以** @注解名 **在代码中存在。例如: ​ Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在Annotation的\\\"name = value\\\"对

    2023年04月24日
    浏览(32)
  • Java_单元测试、反射

    1.1 单元测试快速入门 所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。 我们想想,咱们之前是怎么进行测试的呢? 比如说我们写了一个学生管理系统,有添加学生、修改学生、删除学生、查询学生等这些功能。要对这些功能这几个功能进行测试

    2024年01月18日
    浏览(30)
  • java的单元测试和反射

    就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试,且各自独立 测试的方法必须是 公共,无参,无返回值 测试

    2024年04月28日
    浏览(24)
  • Java中的单元测试,反射和枚举

    2024年02月05日
    浏览(39)
  • JAVA学习-注解.基于注解的单元测试

            基于注解的单元测试是一种使用注解来简化和增强测试代码编写和执行的方法。在Java中,有多个基于注解的单元测试框架可供选择,包括JUnit、TestNG等。下面将对几个常见的基于注解的单元测试框架进行概述,并介绍它们的特点、使用方法以及与其他框架的比较。

    2024年04月28日
    浏览(23)
  • 【Java实用干货】使用@SpringBootTest注解进行单元测试

    【【Java实用干货】使用@SpringBootTest注解进行单元测试 大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得海量学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群~ @SpringBootTest注解是SpringBoot自1.4.0版本开始引入的

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包