12 Junit单元测试、反射、注解

单元测试

介绍

Junit单元测试是做什么的?

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

Junit单元测试框架

  • 可以用来对方法进行测试,它是由Junit公司开源出来的

Junit单元测试的优点是什么?

  • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。
  • 不需要程序员去分析测试的结果,会自动生成测试报告出来。
  • JUnit可以选择执行哪些测试方法,可以一键执行全部测试方法的测试。
  • JUnit可以生测试报告,如果测试良好则是绿色;如果测试失败,则是红色。
  • 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

Junit框架快速入门(步骤)

断言Assert(静态类)

需求

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

具体步骤

  1. 将Junit框架的jar包导入到项目中(资料中已经提供)
  2. 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值
  3. 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试;
  4. 开始测试:选中测试方法,右键选择“JUnit运行” ,如果测试通过则是绿色;如果测试失败,则是红色

JUnit的注解有哪些?

(Junit 4.xxxx版本)
注解说明
@Test测试方法
@Before用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。
@After用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。
@BeforeClass用来静态修饰方法,该方法会在所有测试方法之前只执行一次。
@AfterClass用来静态修饰方法,该方法会在所有测试方法之后只执行一次。
  • 在测试方法执行前执行的方法,常用于:初始化资源。
  • 在测试方法执行完后再执行的方法,常用于:释放资源。
(Junit 5.xxxx版本)
注解说明
@Test测试类中的方法必须用它修饰才能成为测试方法,才能启动执行
@BeforeEach用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。
@AfterEach用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。
@BeforeAll用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。
@AfterAll用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。
  • 开始执行的方法:初始化资源
  • 执行完之后的方法:释放资源

反射

认识反射(框架 源码)

反射(Reflection):是加载类,并允许以编程的方式解剖中的各种成分**(成员变量、方法、构造器等)**。

场景: 写一个方法,接收一个对象,然后打印出对象中的成员属性名

反射的基本作用、关键?

  • 反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。
  • 反射的核心思想和关键就是:得到编译以后的class文件对象。
反射学什么

学习获取类的信息、操作它们

1、反射第一步:加载类,获取类的字节码:Class对象, 如此才可以解析类的全部成分

2、获取类的构造器:Constructor对象

3、获取类的成员变量:Field对象

4、获取类的成员方法:Method对象

反射第一步:加载类,获取类的字节码:Class对象
image-20240415113928473

获取Class对象的三种方式

  • 直接使用类名.class获取:Class c1 = 类名.class
  • 调用Class提供的方法:Class c2 = Class.forName(“全类名”)
  • 调用Object提供的方法:Class c3 = 对象.getClass()

获取类的构造器

获取类的构造器、并对其进行操作

Class提供了从类中获取构造器的方法。

方法说明
Constructor<?>[] getConstructors()获取所有的公共构造器(只能获取public修饰的)
Constructor<?>[] getDeclaredConstructors()获取全部构造器(只要存在就能拿到)
Constructor getConstructor(Class<?>… parameterTypes)获取某个公共构造器(只能获取public修饰的)
Constructor getDeclaredConstructor(Class<?>… parameterTypes)获取某个构造器(只要存在就能拿到)

获取类构造器的作用:依然是初始化对象返回

Constructor提供的方法说明
T newInstance(Object… initArgs)调用此构造器对象表示的构造器,并传入参数,完成对象的初始化并返回
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)

反射得到的构造器可以做什么?

  • 依然是创建对象的
    • public newInstance(Object… initargs)
  • 如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象
    • setAccessible(boolean)
    • 反射可以破坏封装性,私有的也可以执行了。

获取类的成员变量

Class提供了从类中获取成员变量的方法。

方法说明
public Field[] getFields()获取类的所有公共成员变量(只能获取public修饰的)
public Field[] getDeclaredFields()获取类的全部成员变量(只要存在就能拿到)
public Field getField(String name)获取类的某个公共成员变量(只能获取public修饰的)
public Field getDeclaredField(String name)获取类的某个成员变量(只要存在就能拿到)

获取到成员变量的作用:依然是赋值、取值

Field的方法说明
public void set(Object obj, Object value)赋值
public Object get(Object obj)取值
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)
  • 如果某成员变量是非public的,需要打开权限(暴力反射),然后再取值、赋值
    • setAccessible(boolean)

获取类的成员方法

Class提供了从类中获取成员方法的API。

方法说明
Method[] getMethods()获取类的全部公共成员方法(只能获取public修饰的)
Method[] getDeclaredMethods()获取类的全部成员方法(只要存在就能拿到)
Method getMethod(String name, Class<?>… parameterTypes)获取类的某个公共成员方法(只能获取public修饰的)
Method getDeclaredMethod(String name, Class<?>… parameterTypes)获取类的某个成员方法(只要存在就能拿到)

成员方法的作用:依然是执行

Method提供的方法说明
public Object invoke(Object obj, Object… args)触发某个对象的该方法执行。
public void setAccessible(boolean flag)设置为true,表示禁止检查访问控制(暴力反射)

反射得到成员方法可以做什么?

  • 依然是在某个对象中触发该方法执行。

    • Object invoke(Object obj, Object… args)
  • 如果某成员方法是非public的,需要打开权限(暴力反射),然后再触发执行

    • setAccessible(boolean)

反射为何可以给约定了泛型的集合存入其他类型的元素?

  • 编译成Class文件进入运行阶段的时候,泛型会自动擦除。
  • 反射是作用在运行时的技术,此时已经不存在泛型了。

作用、应用场景

反射的作用

  • 可以在运行时得到一个类的全部成分然后操作。
  • 可以破坏封装性。(很突出)
  • 也可以破坏泛型的约束性。(很突出)
  • 更重要的用途是适合:做Java高级框架
  • 基本上主流框架都会基于反射设计一些通用技术功能。
使用反射做一个简易版的框架(案例)

需求:

  • 对于任意一个对象,该框架都可以把对象的字段名和对应的值,然后打印在控制台。

实现步骤

  1. 定义一个方法,可以接收任意对象
  2. 每收到一个对象后,使用反射获取该对象的Class对象,然后获取全部的成员变量
  3. 遍历成员变量,然后提取成员变量在该对象中的具体值
  4. 把成员变量名、和其值,打印到控制台即可

注解

快速入门

注解(Annotation)

  • 就是Java代码里的特殊标记,比如:@Override、@Test等
  • 这些标记会被特定的注解解析器所发现,进而决定应该怎样去编译或者执行被注解标记出来的程序
//元注解
public @interface 注解名称 { }
注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。元注解
指的是:修饰注解的注解,可以指定注解的标注位置和保留阶段@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test { }@Target
作用:声明被修饰的注解只能在哪些位置使用
@Target(ElementType.TYPE)
TYPE,类,接口
FIELD, 成员变量
METHOD, 成员方法
PARAMETER, 方法参数
CONSTRUCTOR, 构造器
LOCAL_VARIABLE, 局部变量@Retention
作用:声明注解的保留阶段
@Retention(RetentionPolicy.RUNTIME)
1. SOURCE 只作用在源码阶段,字节码文件中不存在。
2. CLASS(默认值)保留到字节码文件阶段,运行阶段不存在.
3. RUNTIME(开发常用)一直保留到运行阶段。

注解的作用

  • 对Java中类、方法、成员变量做标记,然后进行特殊处理。
  • 例如:JUnit框架中,标记了注解@Test的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法执行

自定义注解

public @interface 注解名称 {public 属性类型 属性名() default 默认值 ;}

注解的解析

什么是注解的解析?

就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。

如何解析注解?

  • 指导思想:要解析谁上面的注解,就应该先拿到谁
  • 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解
  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
  • Class 、 Method 、 Field , Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力

注解解析的方式

AnnotatedElement接口提供了解析注解的方法说明
public Annotation[] getDeclaredAnnotations()获取当前对象上面的注解。
public T getDeclaredAnnotation(Class annotationClass)获取指定的注解对象
public boolean isAnnotationPresent(Class annotationClass)判断当前对象上是否存在某个注解
解析注解的案例

需求如下

  • 定位到指定包中所有带@ClassNameCheck注解的类,然后判断类名是否是以Heima开头,如果不是,就抛异常

下面分析一下步骤

  1. 定义一个类叫ClassNameCheckParser,在类中定义一个checkClassName方法,用来完成功能
  2. 获取项目中指定包下的所有类(此功能已经在工具类中提供好了方法,可以直接使用)
  3. 遍历得到每一个类,然后判断类上是否有@ClassNameCheck注解
  4. 如果有注解,则获取到类名进行判断,如果不符合规范,则放到一个准备好的集合中
  5. 等到遍历结束,查看集合中是否有元素;有就说明存在不符合规范的类名;打印结果,抛出异常

注解的属性

在定义注解的时候,还可以通过属性来进一步描述注解的细节
public @interface 注解名称 {public 属性类型 属性名() default 默认值 ;
}
特殊属性名: value
如果注解中只有一个value属性,使用注解时,value名称可以不写!!
解析注解的案例改进

需求如下:

  • 在定位到有问题的类名的时候,要打印出类的开发者和作用

下面分析一下步骤:

  1. 修改@ClassNameLimit注解,添加author和value属性
  2. 修改解析器的类,解析出代码的开发者和作用并打印出来

Lombok

问题分析
image-20240415142151704
lombok

Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

注解作用
@Getter/@Setter为所有的属性提供get/set方法
@ToString会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
@Data提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor为实体类生成无参的构造器方法
@AllArgsConstructor为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

注意: Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)

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

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

相关文章

深度学习中的子空间、线性变换和矩阵概念应用

1.表示子空间 在深度学习中&#xff0c;“不同的表示子空间”通常是指模型通过不同的参数&#xff08;例如权重矩阵&#xff09;将输入数据映射到不同的高维空间&#xff0c;这些空间被称为表示子空间。每个子空间都能够捕获输入数据中不同的特征或模式。以下是一些详细解释&am…

Spring Boot 中Mybatis使用Like的使用方式和注意点

说明 模糊查询在项目中还是经常使用的&#xff0c;本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题。 使用Springboot简单配置一下Mybatis&#xff0c;然后进行说明。Springboot集成Mybatis这里就不做介绍了&#xff0c;这里我们主要介绍一下在mybat…

VS Code开发STM32F4xx jlink接口swd模式

VS Code开发STM32F4xx jlink接口swd模式(测试OK) 下面的代码(已验证),只作为参考,不同情况的更改参照文章末尾链接 c_cpp_properties.json代码 (其中include路径和宏定义可以参照makefile添加) : {"configurations": [{"name"…

第三节课,后端登录【1】.1--本人

一、后端登录逻辑&#xff0c;检测账户密码是否合法及密码输入是否正确 视频链接&#xff1a; 网址&#xff1a; 第三节&#xff1a;【视频】后端登录逻辑&#xff0c;检测账户密码是否合法及密码输入是否正确视频链接&#xff1a;-CSDN博客 从5.1开始 这是一个Java方法&am…

Swift - 基础语法

文章目录 Swift - 基础语法1. 常量1.1 只能赋值1次1.2 它的值不要求在编译时期确定&#xff0c;但使用之前必须赋值1次1.3 常量、变量在初始化之前&#xff0c;都不能使用 2. 标识符3. 常用数据类型4. 字面量4.1 布尔4.2 字符串4.3 整数4.4 浮点数4.5 数组4.6 字典 5. 类型转换…

【华为】VRRP的实验配置

【华为】VRRP的实验配置 实验需求拓扑LSW 3LSW 1基础配置VRRPDHCPOSPF默认路由 LSW 2基本配置VRRPDHCPOSPF默认路由 R1ISPPC1PC2 测试上网VRRP实验需求监视端口 配置文档 实验需求 ① 该公司有市场部和技术部&#xff0c;分别划在VLAN 10 和 VLAN 20里面 ② 此时为了网络的稳…

Eclipse内存分析器 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

1.visualvm实时监测 2.Memory Analyzer Tool打开 3.工具的使用可以参考 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 ------------------------ 1.我远程发现是其中一个客户端A请求服务器页面响应&#xff0c;一直得不到响应&#xff0c;然后客户端A一直请求&am…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

【可下载】CDA 1级教材《精益业务数据分析》2023最新版

十年磨一剑&#xff0c;今日把书展&#xff01; 作为国内率先成立的专注于数据科学领域的专业研究团队&#xff0c;CDA数据科学研究院组织多名行业知名专家&#xff0c;在对近十年的教学和研究成果进行凝练&#xff0c;并紧密结合各行业领军企业的实际业务数据分析需求和案例后…

手写SpringMVC开发框架

运行环境 JDK &#xff1a;17 IntelliJ IDEA &#xff1a; 2022.3 Tomcat&#xff1a;8.5.86 前期工作 先创建一个新的Maven项目&#xff0c;按照图示操作&#xff1a; 在这里我们选择Maven Archetype选项&#xff0c;写好项目名称&#xff1a;Handwriting-SpringMVC&#xff…

某知乎APP - X-Zse-96

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 接口网址 app 版本: 8.10.0 aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM 加密位置分析 > …

EOCRDS1T-05S反时限过电流保护继电器 施耐德韩国三和

三和EOCR株式会社是韩国zui大的电动机保护器生产企业&#xff0c;公司由金仁锡博士&#xff08;施耐德电气集团韩国*执行官&#xff09;于1981年建立。 2001年&#xff0c;为了把企业发展成性的、战略性企业&#xff0c;随后加入了法国施耐德电气集团公司。 EOCR主要产品有电…

YOLO新鲜腐烂水果检测数据集:8类,11000多张图像,标注完整

YOLO新鲜腐烂水果检测数据集&#xff1a;8类&#xff0c;11000多张图像&#xff0c;yolo标注完整&#xff0c;包含烂苹果&#xff0c;烂香蕉&#xff0c;烂橙子&#xff0c;烂石榴&#xff0c;好苹果&#xff0c;好香蕉&#xff0c;好橙子&#xff0c;好石榴8个类别 图像统一分…

<计算机网络自顶向下> Internet Protocol

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号&#xff08;IPV4 0100, IPV6 0110&#xff09; headlen&#xff1a;head的长度&#xff08;头部长度字段&#xff08;IHL&#xff09;指定了头部的长度&#xff0c;以32位字&#xff08;4字节&#xff09;为单位计算。这…

OpenHarmony语言基础类库【@ohos.util.LightWeightMap (非线性容器LightWeightMap)】

LightWeightMap可用于存储具有关联关系的key-value键值对集合&#xff0c;存储元素中key值唯一&#xff0c;每个key对应一个value。 LightWeightMap依据泛型定义&#xff0c;采用轻量级结构&#xff0c;初始默认容量大小为8&#xff0c;每次扩容大小为原始容量的两倍。 集合中…

ElasticSearch语句中must,must_not,should 组合关系

前言&#xff1a; 在实际应用中&#xff0c;发现当bool中同时使用must和should 没有达到想要的想过&#xff0c;而是只展示了must中的命中数据&#xff0c;所以打算探究一下bool中 三种逻辑关系的组合。 上述查询语句只展示了must的结果&#xff0c;没有should中的结果&#…

OSPF的LSA详解

一、什么是LSA&#xff1f;LSA作用&#xff1f; 在OSPF协议中&#xff0c;LSA全称链路状态通告&#xff0c;主要由LSA头部信息&#xff08;LSA摘要&#xff09;和链路状态组成。部分LSA只有LSA头部信息&#xff0c;无链路状态信息。使用LSA来传递路由信息和拓扑信息&#xff0c…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 &#xff08;零&#xff09;鸿蒙HarmonyOS入门&#xff1a;如何配置环境&#xff0c;输出“Hello World“ &#xff08;一&#xff09;鸿蒙HarmonyOS开发基础 &#xff08;二&#xff09;鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 &#xff08;三&#xff09;鸿蒙…

STM32(垃圾桶开关盖)

封装超声波的代码 一、配置引脚的连接 二、配置 三、写代码 四、配置定时器 查找合适的定时器 其实这里的是remap&#xff08;复用&#xff09;&#xff0c;不重要 重要的是看Default才对 仔细查看之后发现还是能用的 先把开关灯封装好 再封装舵机 ----------------------…

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…