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.hqwc.cn/news/618288.html

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

相关文章

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…

2024年阿里云优惠券领取攻略

阿里云作为国内领先的云计算服务提供商&#xff0c;以其稳定、高效、安全的服务赢得了众多用户的青睐。为了吸引用户上云&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将为大家详细解读2024年阿里云优惠券的领券攻略&#xff0c;帮助大家轻…

IP协议

IP协议 1. 网络层简介2. IP协议2.1 基本概念2.2 IP协议的格式 3. 分片与组装4. 网段划分5. 特殊IP地址6. IP地址的数量限制7. 私网IP地址与公网IP地址8. 路由9. 路由表生成算法 1. 网络层简介 网络层介于传输层和数据链路层之间&#xff0c;其主要作用是实现两个不同网络系统之…

2024.4.19 Python爬虫复习day07 可视化3

综合案例 需求: 已知2020年疫情数据,都是json数据,需要从文件中读出,进行处理和分析,最终实现数据可视化折线图 相关知识点: json json简介: 本质是一个特定格式的字符串 举例: [{},{},{}] 或者 {}python中json包: import jsonpython数据转为json数据: 变量接收json…

深入理解计算机网络分层结构

一、 为什么要分层&#xff1f; 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次&#xff0c;每个层次负责特定的功能。这样做有以下几个好处&#xff1a; 模块化设计&#xff1a;每个层次都有清晰定义的功能和接口&#xff0c;使得网络系统更易于设…

通讯录的实现(顺序表版本)

我们知道通讯录是基于顺序表的前提下&#xff0c;要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。&#xff08;注意今天代码量有点多&#xff0c;坚持一下&#xff09;。冲啊&#xff01;兄弟们&#xff01; 顺序表的简单理解 对于顺序表&#xff0c;我们首…

HTML常用标签

标签页&#xff08;title&#xff09;&#xff1a; ~title 表示标题标签&#xff0c;文字会显示到标签页 ~主要与SEO有关&#xff08;了解&#xff09; &#xff08;搜索引擎在抓取页面时&#xff0c;会通过title来识别网站内容&#xff09; 标题&#xff08;共6级&#xff09;…

深入理解DES算法:原理、实现与应用

title: 深入理解DES算法&#xff1a;原理、实现与应用 date: 2024/4/14 21:30:21 updated: 2024/4/14 21:30:21 tags: DES加密对称加密分组密码密钥管理S盒P盒安全性分析替代算法 DES算法简介 历史 DES&#xff08;Data Encryption Standard&#xff09;算法是由IBM研发&…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点&#xff1a;电流小&#xff0c;工作频率高 选型依据&#xff1a;正向电流、正向压降、功耗&#xff0c;反向最大电压&#xff0c;反向恢复时间&#xff0c;封装等 类型&#xff1a;BAS316 ; IN4148WS 应用电路: 说明&#xff1a;应用…

c/c++普通for循环学习

学习一下 for 循环的几种不同方式&#xff0c;了解一下原理及差异 完整的测试代码参考 GitHub &#xff1a;for 循环测试代码 1 常用形态 对于 for 循环来说&#xff0c;最常用的形态如下 for (表达式1; 表达式2; 表达式3) {// code }流程图如下&#xff1a; 编写测试代码…

5、JVM-G1详解

G1收集器 -XX:UseG1GC G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#xff0c;JVM目标…

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …