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 {@Testpublic void testPrintNumber(){StringUtil.printNumber("admin");StringUtil.printNumber(null);}@Testpublic 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;@Beforepublic void setUp() throws Exception {System.out.println("--->Setup Before 测试配置文件执行了---------");socket = new Socket("127.0.0.1", 8888);}@Afterpublic void setUp1() throws Exception {System.out.println("--->Setup After 测试配置文件执行了---------");socket.close();}@BeforeClasspublic static void setUp2() throws Exception {System.out.println("--->Setup BeforeClass 测试配置文件执行了---------");socket1=new Socket("127.0.0.1", 8888);}@AfterClasspublic static void setUp3() throws Exception {System.out.println("--->Setup AfterClass 测试配置文件执行了---------");socket1.close();}@Testpublic void testPrintNumber(){StringUtil.printNumber("admin");StringUtil.printNumber(null);}@Testpublic 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 {@Testpublic 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());}}@Testpublic 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 {@Testpublic 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());}}@Testpublic 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 获取类的成员变量

在这里插入图片描述

在这里插入图片描述

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

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

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

在这里插入图片描述

    @Testpublic 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.mzph.cn/news/823141.shtml

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

相关文章

Day 23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

修剪二叉搜索树 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 ​ 最直接的想法&#xff0…

最强解释!Python 包的依赖管理,有解了!

之前一直比较抵触用 Python &#xff0c;很大一部分原因是觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具&#xff0c;通过 package.json 配置项目依赖&#xff0c;最多再通过 nvm 来进行环境切换&#xff1b;Java 有 Maven Gradle 来进行包管理和项目依赖配置…

今天刷两题(day2)

题目一&#xff1a;最长公共前缀 题目描述&#xff1a; 给你一个大小为 n的字符串数组 strs &#xff0c;其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;返回这个公共前缀。输入输出描述&#xff1a; 输入&#xff1a;"abca","…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂&#xff0c;牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

C++ 秋招必知必会(数据结构与算法:下)

20. 二叉树的定义与操作 二叉树&#xff08;binary tree&#xff09;是一种非线性数据结构&#xff0c;代表着祖先与后代之间的派生关系&#xff0c;体现着“一分为二”的分治逻辑 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含&#xff1a;值、左子…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

储能的全生命周期成本即平准化度电成本的计算方法及python实践

1. 平准化度电成本&#xff08;LCOE&#xff09;是一种衡量电力项目经济性的指标 LCOE&#xff08;Levelized Cost of Energy,&#xff09;的概念最早由美国国家可再生能源实验室&#xff08;NREL&#xff09;在1995年提出&#xff0c;它是通过将一个项目生命周期内的所有成本…

黑马头条项目结构

微服务架构具有许多优点&#xff0c;其中一些主要优点包括&#xff1a; 松耦合性&#xff1a;每个微服务都是独立的&#xff0c;可以独立部署、独立扩展和独立更新&#xff0c;这种松耦合性使得系统更加灵活&#xff0c;易于维护和演化。 技术多样性&#xff1a;由于每个微服务…

基于springboot实现知识管理系统项目【项目源码+论文说明】

基于springboot实现知识管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目+题解+在线评测【二分】

2024年4月13日美团春招实习试题【第四题:乘积因子数】-题目题解在线评测【二分】 题目描述&#xff1a;输入描述输出描述样例 解题思路一&#xff1a;python解题思路二&#xff1a;c解题思路三&#xff1a;0 题目描述&#xff1a; 塔子哥拿到了一个数组&#xff0c;她有q次查询…

HTTP/1.1特性总结

优点 【简单&#xff0c;灵活和易于扩展&#xff0c;应用广泛和跨平台】 1.简单&#xff1a; http基本的报文格式就是headerbody&#xff0c;头部信息也是key-value简单的文本形式&#xff0c;易于理解&#xff0c;降低了学习和使用的门槛 2.灵活和易于扩展&#xff1a; &…

Redis 配置与使用 (Linux 虚拟机Windows客户端)

Centos7 安装Redis详细教程 - JcongJason - 博客园 (cnblogs.com) 安装 下载redis安装包并解压 # 下载&#xff0c;我是在root下执行的下载&#xff0c;所以我的下载目录为&#xff1a;/root/redis-5.0.5&#xff0c;这里按照自己的实际情况调整 wget https://download.redi…

Methoxy PEG Glutaric Acid可以改善物质的溶解性、稳定性和生物相容性

【试剂详情】 英文名称 mPEG-GA&#xff0c;mPEG-Glutaric Acid&#xff0c; Methoxy PEG GA&#xff0c; Methoxy PEG Glutaric Acid 中文名称 聚乙二醇单甲醚戊二酸&#xff0c; 甲氧基-聚乙二醇-戊二酸 外观性状 由分子量决定&#xff0c;固体或液体 分子量 400&…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…

为什么说六西格玛培训公司是企业问题的“终结者”

随着六西格玛管理方法的走红&#xff0c;六西格玛培训公司应运而生&#xff0c;致力于帮助企业解决各种核心问题&#xff0c;实现业绩的飞跃。那么&#xff0c;六西格玛培训公司究竟能为企业解决哪些问题&#xff1f;又为什么说六西格玛培训公司是企业问题的“终结者”呢&#…

第47期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

【第3期】PMC对话标杆用户:兆原数通在SeaTunnel的应用实践

&#x1f4e3;随着技术快速发展&#xff0c;企业对数据系统的现代化改造需求日益增加。在这种背景下&#xff0c;如何在保持业务连续性的同时&#xff0c;实现数据系统的平滑迁移与升级呢&#xff1f;加入我们的本期技术访谈节目&#xff0c;来听听李洪军老师分享他们如何利用S…

算法题解记录11+++从前序与中序遍历序列构造二叉树(百日筑基)

题目描述&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,…

树莓派驱动开发--iic篇(JY901S陀螺仪的三轴角度简单读取)

前言&#xff1a;既然大家都到了这步&#xff0c;想必对驱动开发有着一定的理解啦吧&#xff01;&#xff01;那我在前面说一下流程&#xff1a; 修改编译设备树》》》编写编译驱动文件》》》编写编译app文件》》》ftp挂载将前面3复制到树莓派的对应位置》》》加载驱动模块》》…

2024软件测试自动化框架都有哪些?

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐&#xff0c;必须加快应用程序的交付时间&#xff0c;但不能以牺牲质量为代价。快速实现质量是必要的&#xff0c;因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…