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

news2024/11/17 15:33:25

一、单元测试

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

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 常用注解

在这里插入图片描述

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);
    }
}

在这里插入图片描述

二、反射

在这里插入图片描述

2.1 反射(Reflection)

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。
在这里插入图片描述

2.2 反射学什么?

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

在这里插入图片描述

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 获取类的构造器

在这里插入图片描述

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());
    }
}

获取类构造器的作用:依然是初始化一个对象返回
在这里插入图片描述

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 获取类的成员变量

在这里插入图片描述

在这里插入图片描述

    @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 获取类的成员方法

在这里插入图片描述
在这里插入图片描述

    @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的框架,基本上,主流的框架都会基于反射设计出一些通用的功能,

在这里插入图片描述

    @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);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FJSP:水鹿优化算法(Sambar Optimization Algorithm,SOA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

什么是 MVVM、mvc 模型

mvc模型 MVC: MVC 即 model-view-controller&#xff08;模型-视图-控制器)是项目的一种分层架构思想&#xff0c;它把复杂的业务逻辑&#xff0c; 抽离为职能单一的小模块&#xff0c;每个模块看似相互独立&#xff0c;其实又各自有相互依赖关系。它的好处是&#xff1a;保证了…

【信道编码】1 无线通信发展历程与挑战、信道分类、多径信道、单径信号传输与检测

【信道编码】1 无线通信发展历程与挑战、信道分类、多径信道、单径信号传输与检测 写在最前面无线通信发展历程一、电磁波的发现与利用&#xff08;19世纪末至20世纪初&#xff09;二、无线电技术的广泛应用&#xff08;20世纪初至20世纪中叶&#xff09;三、数字化与移动通信的…

HTML重要标签重点及属性(表格表单列表)——之转生在异世界学前端

表格标签 table是用于定义表格的标签 tr是用于定义表格的行 td是用来定义表格的列&#xff0c;th是表头一般只有一个表头会加粗 表格属性border是设置边框值为1;1是有边框&#xff0c; align设置居中对齐方式center&#xff0c;left&#xff0c;right cellpadding设置文字…

如何下载和安装Google Chrome扩展插件:一步步指南

Google Chrome 插件为我们提供了这样的便利&#xff0c;但有时找到一个有用的插件后&#xff0c;我们可能需要将其下载到本地以便离线使用或备份。 一、为什么可以从Google Chrome商店直接下载插件&#xff1f; Google Chrome 扩展插件主要通过Chrome Web Store分发&#xff…

万兆以太网MAC设计(4)CRC_process模块

文章目录 前言一、模块功能二、实现过程三、仿真总结 前言 上文介绍的MAC_RX模块当中增加了CRC校验和比对的功能&#xff0c;本文将根据CRC校验的结果&#xff0c;来决定将数据输出到上层用户还是丢弃。 一、模块功能 接收MAC_RX模块输出的AXIS数据&#xff0c;存入本地环形…

Spring Cloud学习笔记:Eureka集群搭建样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、项目架构2、Dependency3、项目启动类4、application.yml5、启动项目 1、项目架构 因为这是单机模拟集群搭建&#xff0c;为了方便管理就都放在了一个项目中。这次准备搭建三个项目server1, server2, server3 …

软件杯 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

vmware安装win10及ubuntu

安装win10 新建一个文件夹 选择刚才创建的文件夹 选择需要保存文件的位置&#xff0c;还是选择刚才创建的文件夹 选择自定义硬件 选择下载的win10镜像iso文件,导入后&#xff0c;点击完成即可 接下来就是下一步 没有此电脑&#xff0c;可以点击个性化-》主题-》桌面设置…

杰发科技AC7840——CAN通信简介(4)_过滤器设置

0. 简介 注意&#xff1a;过滤器最高三位用不到&#xff0c;因此最高位随意设置不影响过滤器。 1. 代码分析 注意设置过滤器数量 解释的有点看不懂 详细解释...也看不大懂 Mask的第0位是0&#xff0c;其他位都是1(就是F?)&#xff0c;那就指定了接收值就是这个数&#xff0c;…

专业140+总分410+北京理工大学826信号处理导论考研经验北理工电子信息通信工程,真题,参考书,大纲。

今年考研专业课826信号处理导论&#xff08;信号系统和数字信号处理&#xff09;140&#xff0c;总分410&#xff0c;顺利上岸&#xff01;回看去年将近一年的复习&#xff0c;还是记忆犹新&#xff0c;有不少经历想和大家分享&#xff0c;有得有失&#xff0c;希望可以对大家复…

JVM虚拟机(四)年轻代中的 S0区、S1区和 from区、to区有什么区别?

目录 一、知识回顾二、from区和 to区的交换三、总结 一、知识回顾 什么是年轻代&#xff1f; 年轻代&#xff1a;是 JVM 堆内存中专门用于存储新创建对象的部分&#xff0c;旨在高效处理大量短时间内可能被回收的对象。 年轻代有哪几部分&#xff1f; Eden区&#xff1a;年轻…

【opencv】示例-stereo_match.cpp 立体匹配:通过对左右视图图像进行处理来生成视差图和点云数据...

/** stereo_match.cpp* calibration** 创建者 Victor Eruhimov&#xff0c;日期为 2010年1月18日。* 版权所有 2010 Argus Corp.**/#include "opencv2/calib3d/calib3d.hpp" // 导入OpenCV相机标定和三维重建相关的头文件 #include "opencv2/imgproc.hpp&qu…

【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

CSS 实现视差滚动效果

一、是什么 视差滚动&#xff08;Parallax Scrolling&#xff09;是指多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验 我们可以把网页解刨成&#xff1a;背景层、内容层、悬浮层 当滚动鼠标滑轮的时候&#xff0c;各个图层以不…

python中的列表、元组、字典、集合(元组篇)

数据类型定义符号访问元素是否可变是否重复是否有序列表 [ ]索引可变可重复有序元组&#xff08;&#xff09;索引不可变可重复有序字典{key&#xff1a;value}键可变可重复无序集合{ }可变不可重复无序 在形式上&#xff0c;元组的所有元素放在一对圆括号中&#xff0c;元素之…

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序&#xff1a;https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布&#xff1a;https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

C# Solidworks二次开发:相机访问相关API详解

大家好&#xff0c;今天要介绍的API为相机相关的API&#xff0c;这篇文章比较适合女孩子&#xff0c;学会了相机就会拍照了&#xff0c;哈哈。 下面是要介绍的API: &#xff08;1&#xff09;第一个为GetFocalDistance&#xff0c;这个API的含义为获取相机的焦距&#xff0c;…

OLTP 与 OLAP 系统说明对比和大数据经典架构 Lambda 和 Kappa 说明对比——解读大数据架构(五)

文章目录 前言OLTP 和 OLAPSMP 和 MPPlambda 架构Kappa 架构 前言 本文我们将研究不同类型的大数据架构设计&#xff0c;将讨论 OLTP 和 OLAP 的系统设计&#xff0c;以及有效处理数据的策略包括 SMP 和 MPP 等概念。然后我们将了解经典的 Lambda 架构和 Kappa 架构。 OLTP …

微信小程序 发送消息 Token校验失败,请检查确认

如上图&#xff0c;文档中说的是 开发者通过检验 signature 对请求进行校验&#xff08;下面有校验方式&#xff09;。若确认此次 GET 请求来自微信服务器&#xff0c;请原样返回 echostr 参数内容&#xff0c;则接入生效&#xff0c;成为开发者成功&#xff0c;否则接入失败。…