Java进阶16 单元测试XML注解

Java进阶16

一、单元测试

单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单原测试就是针对Java方法的测试,进而检查方法的正确性。简单理解就是测试代码的工具。

1、Junit

1.1 Junit引入

目前测试代码,只能在main方法中测试,如果某个方法的测试失败,其他方法测试会受到影响,而Junit解决了这个问题。

1.2 Junit优点
  • JUnit可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法

  • 单元测试中的某个方法测试失败了,不影响其他方法的测试

  • 运行成功是绿色,运行失败是红色

1.3 Junit基本使用
  • 步骤

    ①手动导入jar包或在外部网络的情况下根据提示敲回车(add 'Junit4' to classpath)

    ②在需要测试的方法上,加入@Test注解

    ③运行绿色(正确),红色(错误)

  • 注意

    Junit测试的方法,必须是public的,且没有参数,没有返回值

二、XML

1、XML引入

XML全称EXtensible Markup Language,是一种可扩展的标记语言。【标记语言:通过标签来描述数据的一门语言】【可扩展:标签名可以自定义】xml文件可以为计算机程序配置参数和初始设置,使用xml文件的好处是可以让项目中使用的数据,灵活的加载和多变,实现解耦。

2、分类

2.1 Properties文件

用于一对一的存储

  • 键值对

  • username=root

  • password=123456

2.1 xml文件

常用于一对多存储

<?xml version="1.0" encoding="utf-8" ?>
<students><!--第一个学生信息--><student><name>张三</name><age>23</age></student><!--第二个学生信息--><student><name>李四</name><age>24</age></student>
</students>

3、优点

  • 作为软件的配置文件

  • 用于进行存储数据和传输数据(其内部格式更便于传输数据)

4、XML语法

4.1 语法规则
  • 创建

    创建一个XML类型的文件,要求文件的后缀必须使用xml。如hello_world.xml

  • 文档声明

    文档声明必须是第一行第一列

    <?xml version="1.0" encoding="UTF-8" ?>
    • version:版本,该属性是必须存在

    • encoding:该属性不是必须的,指定打开当前的xml文件应该用什么字符编码表(一般都是UTF-8)

    • standalone:该属性不是必须的,描述XML文件是否依赖其他的XML文件,取值为yes/no

  • 标签规则

    • 必须存在一个根标签,有且只能有一个

    • 标签由一对尖括号和合法标识组成

    • 标签必须成对出现

      <student></student>
    • 特殊的标签可以不成对,但是必须有结束标记

      <address/>
    • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来

      <studnet id="1"></studnet>
    • 标签需要正确的嵌套

      <!--这是正确的嵌套--> 
      <student id="1"> <name>张三</name>
      </student><!--这是错误的嵌套--> 
      <student id="1"><name>张三</student>
      </name>
  • 细节

    • XML文件中可以定义注释信息

      <!--这是一条注释信息-->
    • XML文件中可以存在以下特殊字符

      &lt    <   小于
      &gt    >   大于
      &amp   &   和号
      &apos  '   单引号
      &quot  "   引号
    • XML文件中可以存在CDATA区

      <![CDATA[...内容...]]>
4.2 Demo

需求:编写一个城市对应区的xml文件【城市city;区域area】

<?xml version="1.0" encoding="utf-8" ?>
<citys><city name="北京市"><area>东城区</area><area>西城区</area><area>朝阳区</area><area>海淀区</area><area>昌平区</area></city>
</citys>

5、XML约束(了解)

XML约束用来限定xml文件中可使用的标签以及属性,约束文件以后不需要我们自己写,了解即可。有DTD约束和Schema约束

5.1 DTD约束
① 编写DTD约束
  • 步骤

    1.创建一个后缀名为.dtd的文件

    2.看xml文件中使用了哪些元素<!ELEMENT>可以定义元素

    3.判断元素是简单元素还是复杂元素

    【简单元素】没有子元素

    【复杂元素】有子元素的元素

  • 代码实现

    <!--这是一个dtd文件  persondtd.dtd-->
    <!ELEMENT persons (person)>
    <!ELEMENT person (name,age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
② 引入DTD约束
  • 在xml文件内部直接引入

    <!DOCTYPE 根元素名称 [ dtd文件内容 ]>
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE persons [<!ELEMENT persons (person)><!ELEMENT person (name,age)><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>]>
    ​
    <persons><person><name>张三</name><age>23</age></person>
    ​
    </persons>
  • 引入本地dtd

    <!DOCTYPE 根元素名称 SYSTEM 'DTD文件的路径'>
    <!--在person1.xml文件中引入persondtd.dtd约束-->
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE persons SYSTEM 'persondtd.dtd'>
    ​
    <persons><person><name>张三</name><age>23</age></person>
    ​
    </persons>
  • 引入网络dtd

    <!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL">
    ​
    <persons><person><name>张三</name><age>23</age></person>
    ​
    </persons>
5.2 Schema约束
①编写schema约束
  • 步骤

    1.创建一个文件,这个文件的后缀名为.xsd

    2.定义文档声明

    3.schema文件的根标签为<schema>

    4.在<scheam>中定义如下属性:

    • xmlns=http://www.w3.org/2001/XMLSchema

    • targetNamespace = 唯一的url地址,指定当前这个schema文件的名称空间(理解起个名字,顺便打广告)

    • elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件

    5.通过element定义元素

    6.判断当前元素是简单元素还是复杂元素

  • 代码实现

    <?xml version="1.0" encoding="UTF-8" ?>
    ​
    <schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itheima.com"elementFormDefault="qualified"><element name="students"><complexType><sequence><element name="student" maxOccurs="unbounded"><complexType><sequence><element name="name" type="string"></element><element name="age" type="int"></element></sequence><attribute name="id" use="required"/></complexType></element></sequence></complexType></element>
    </schema>
②引入schema约束
<?xml version="1.0" encoding="UTF-8" ?>
​
<!--这里xsi只是因为需要引入多个约束怕属性重名所以取的别名-->
​
​
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.itheima.com"xsi:schemaLocation="http://www.itheima.com students.xsd"><student id="1"><name>张三</name><age>23</age></student>
​<student id="2"><name>李四</name><age>24</age></student>
​
</students>
5.3 Schema和dtd的区别
  • schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd。Schema文件用来约束一个xml文件,同时它自己也被其他文件约束着

  • 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)

  • dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型

  • schema 语法更加的复杂

6、XML解析

解析方式有两种:SAX解析和DOM解析

SAX解析DOM解析
解析方式不会把整体的xml文件都加载到内存中,而是从上往下逐行进行扫描会把整体的xml文件都加载到内存
优点因为逐行解析,无需将整体的xml文件都加载到内存,所以可以解析较大的xml文件可以读取,可以添加,可以删除,可以做任何事情
缺点只能读取,不能添加,不能删除需要xml文件全部加载到内存,所以不能解析非常大的xml文件
6.1 DOM解析
6.1.1 解析文档对象模型

6.1.2 常见解析工具
名称说明
JAXPSUN公司提供的一套XML解析的API
JDOMJDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作
Dom4j是JDOM的升级品,用来读写XML文件的。具有性能优异,功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,Hibernate也用它来读写配置文件
jsoup功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便
6.1.3 准备动作

①导入jar包

②获取Document对象

SAXReader reader = new SAXReader();
Document document = reader.read(url);
System.out.println(document);
6.1.4 方法
方法说明
Element getRootElement()获取根元素对象
方法说明
List<Element> elements()得到当前元素下所有子元素
List<Element> elements(String name)得到当前元素下指定名字的子元素返回集合
Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName()得到元素名字
String attributeValue(String name)通过属性名直接得到属性值
String elementText(子元素名)得到指定名称的子元素的文本
String getText()得到文本
6.1.5 Demo(解析xml信息存入集合)
public class ParseXml {public static void main(String[] args) throws DocumentException {//准备集合ArrayList<Student> list = new ArrayList<>();SAXReader reader = new SAXReader();Document document = reader.read("day16\\src\\com\\itheima\\xml\\students.xml");//1、获取根标签Element rootElement = document.getRootElement();//2、获取根标签下的所有子标签List<Element> elements = rootElement.elements();//3、遍历集合for (Element element : elements) {//4、获取标签属性String id = element.attributeValue("id");//5、获取name标签的值String name = element.element("name").getText();//6、获取age标签的值String age = element.element("age").getText();//7、封装为Student学生对象Student stu = new Student(id,name,Integer.parseInt(age));//8、添加到集合list.add(stu);}list.forEach(System.out::println);}
}

三、注解

Annotation标识注解,是JDK1.5的新特性,作用是对程序进行标注。其实可以对照注释理解(注释是给人看的,而注解是给编译器或虚拟机看的),通过注解可以给类增加一些额外的信息,让编译器或jvm可以根据注解来完成对应的功能

1、JDK常见注解

  • @Override:表示方法的重写

  • @Deprecated:表示修饰的方法已过时

  • @SuppressWarinings("all"):压制警告

除此之外,还需要掌握第三方框架中提供的注解:比如Junit中

  • @Test表示运行测试方法

  • @Before表示在Test之前运行,进行初始化

  • @After表示在Test之后运行,进行收尾

2、自定义注解(了解)

自定义注解单独存在没有意义,一般会跟反射结合起来使用

2.1 格式
public @interface 注解名称 {public 属性类型 属性名 () default 默认值 ;
}
​
public @interface Anno {String show() default "show..." ;
}

属性类型可以是:基本数据类型、String、Class、注解、枚举、以及上述类型的一维数组

public @interface MyAnno {public static final int num1 = 100;public static final String num2 = "abc";public static final MyAnno num3 = null;public static final Class num4 = String.class;public static final int[] num5 = {};
​public abstract String show1() default "show1";public abstract int show2() default 132;public abstract MyAnno2 show3() default @MyAnno2;public abstract Class show4() default String.class;public abstract int[] show5() default {1, 2, 3};
}
public @interface MyAnno {int num1 = 100;String num2 = "abc";MyAnno num3 = null;Class num4 = String.class;int[] num5 = {};
​String show1() default "123";int show2() default 132;MyAnno2 show3() default @MyAnno2;Class show4() default String.class;int[] show5() default {1, 2, 3};
}

注意事项:

  • 在使用注解时,如果注解的属性没有给出默认值,需要手动给出;如@Anno(name="张三")

  • 如果数组中只有一个属性值,在使用时{}是可以省略的

  • 定义注解中,如果有多个属性没有赋值,使用时需要全部赋值

  • 定义注解中如果只有一个属性名称为value,没有赋值,使用时直接给出值,不需要写属性名。如@Anno("要给value赋的值")

3、元注解(了解)

元注解就是描述注解的注解

元注解名说明
@Target指定了注解能在哪里使用
@Retention可以理解为保留时间(生命周期)
3.1 Target注解

用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置,可使用的值定义在ElementType枚举类中,常用值如下:

  • TYPE,类,接口

  • FIELD,成员变量(很少用)

  • METHOD,成员方法

  • PARAMETER,方法参数

  • CONSTRUCTOR,构造方法

  • LOCAL_VARIABLE,局部变量

3.2 Retention注解

用来标识注解的生命周期(有效范围),可使用的值定义在RetentionPolicy枚举类中,常用值如下:

  • SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在

  • CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值

  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段

4、案例(自定义注解)

  • 需求:自定义一个注解@MyAnno,用于指定类的方法上,如果某一个类的方法上使用了该注解,就执行该方法

  • 实现步骤:

    1.自定义一个注解MyAnno,并在类中的某几个方法上加注解

    2.在测试类中,获取注解所在的类的Class对象

    3.获取类中所有的方法对象

    4.遍历每一个方法对象,判断是否有对应的注解

  • //自定义注解
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnno {
    }
  • //Test类
    public class MethodTest {@MyAnnopublic void show1(){System.out.println("show1...");}
    ​@MyAnnopublic void show2(){System.out.println("show2...");}
    ​public void show3(){System.out.println("show3...");}
    }
  • public class ReflectTest {/*简易的测试框架,通过反射操作字节码对象,执行需求的逻辑*/public static void main(String[] args) throws Exception{//1、通过反射获取字节码文件对象Class<MethodTest> methodTestClass = MethodTest.class;//2、创建对象MethodTest mt = methodTestClass.getConstructor().newInstance();
    ​//3、通过反射获取这个类里面所有的方法对象Method[] methods = methodTestClass.getMethods();//4、遍历数组,得到每一个方法对象for (Method method : methods) {//核心:判断这个方法头上有没有注解if(method.isAnnotationPresent(MyAnno.class)){//执行方法method.invoke(mt);}}}
    }

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

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

相关文章

全面了解CC攻击和防范策略

前言 “ CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。” 什么是CC攻击&#xff1f; CC攻击前身是一个名为Fatboy的攻击程序&#xff0c;而之所以后来人们会称之为CC&#xff0c;也叫HTTP-FLOOD&#xff…

程序语言基础知识

文章目录 1.程序设计语言2. 程序设计语言的特点和分类3. 编译程序&#xff08;编译器&#xff09;的工作原理4. 程序语言的数据成分4.1 数据成分4.2 运算成分4.3 控制成分4.4 传输成分 1.程序设计语言 低级语言&#xff1a;机器语言和汇编语言。 机器语言&#xff1a;二进制代…

Java面向对象-常用类 (包装类)

常用类 – 包装类 基本数据类型的包装类 理解&#xff1a;包装类是8种基本数据类型对应的类 出现原因&#xff1a;Java是一种纯面向对象语言&#xff0c;但是java中有8种基本数据类型&#xff0c;破坏了java为纯面向对象的特征。为了承诺在java中一切皆对象&#xff0c;java…

c/c++ 判断质数(素数)

目录 一.常规方法 二.进阶方法 三.代码示例&#xff08;运用进阶方法&#xff09; 质数是整数且仅能被自身和1整除 一.常规方法 所以我们根据质数的这个定义便可用以下思路判断&#xff1a;设需要检测的数为x。y为除1和自己的除数 逐步检测x是否可被y整除&#xff0c;如x…

MySQL之架构设计与历史(一)

架构设计与历史 概述 和其他数据库系统相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥好的作用&#xff0c;但同时也会带来一点选择上的困难。MySQL并不完美&#xff0c;却足够灵活&#xff0c;能够适应高要求的环境&#xff0c;例如…

Android 逆向学习【1】——版本/体系结构/代码学习

#Android 历史版本 参考链接&#xff1a;一篇文章让你了解Android各个版本的历程 - 知乎 (zhihu.com) 三个部分&#xff1a;api等级、版本号、代号&#xff08;这三个东西都是指的同一个系统&#xff09; API等级&#xff1a;在APP开发的时候写在清单列表里面的 版本号&…

Vitis HLS 学习笔记--控制驱动TLP - Dataflow视图

目录 1. 简介 2. 功能特性 2.1 Dataflow Viewer 的功能 2.2 Dataflow 和 Pipeline 的区别 3. 具体演示 4. 总结 1. 简介 Dataflow视图&#xff0c;即数据流查看器。 DATAFLOW优化属于一种动态优化过程&#xff0c;其完整性依赖于与RTL协同仿真的完成。因此&#xff0c;…

力扣第206题-反转链表

反转链表的效果示意图 要改变链表结构时&#xff0c;通常加入一个创建的临时头结点会更容易操作 时间复杂度&#xff1a;遍历2遍&#xff0c;2n 空间复杂度&#xff1a;额外创建一个栈&#xff0c;n (空间创建一个数组长度最大为5000&#xff0c;你说这个数组是栈也可以&…

【C++】详解多态

目录 初识多态 多态的条件 接口继承和实现继承 override 和 final 多态原理 继承与虚函数表 析构函数与多态 抽象类 本篇内容关联知识的链接 【C】详解C的继承-CSDN博客 【C】详解C的模板-CSDN博客 【C】C的内存管理-CSDN博客 初识多态 父类被不同子类继承后&#…

报名开启!2024 开源之夏丨Serverless Devs 课题已上线!

Serverless 是近年来云计算领域热门话题&#xff0c;凭借极致弹性、按量付费、降本提效等众多优势受到很多人的追捧&#xff0c;各云厂商也在不断地布局 Serverless 领域。 Serverless Devs 是一个由阿里巴巴发起的 Serverless 领域的开源项目&#xff0c;其目的是要和开发者们…

leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍

文章目录 前言一、移除链表元素二、链表的中间节点三、合并两个有序链表四、反转链表五、链表分割六、倒数第k个节点总结 前言 leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍 一、移除链表元…

扫盲:如何提升医学图像分割性能-to do list

导读&#xff1a;本文主要讨论了如何改进图像分割项目中的分割性能&#xff0c;包括一般性和具体性的问题解决方案&#xff0c;以及如何通过调整模型参数、改善数据集质量、优化模型架构、调整超参数、增加训练时长、改善图像分辨率和后处理技术等方法来提高分割效果。 图像分…

拼多多暂时超越阿里成为电商第一

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 拼多多的财报又炸裂了&#xff1a; 拼多多发布了第一季度财报&#xff0c;营收868亿&#xff0c;增长了131%&#xff0c;净利润279亿&#xff0c;增长了246%&#xff0c;营销服务收入424亿&#xff0c;也就是商家的…

小林coding笔记

MySQL执行流程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层。Server 层负责建立连接、分析和执行 SQL。存储引擎层负责数据的存储和提取。 Mysql执行 启动Mysql net start mysql登陆 mysql -u root -p输入密码

SwiftUI中的动画.animation和withAnimation

动画是通过改变视图的状态来给视图添加平滑视图变化的能力。SwiftUI中有两种类型的动画:隐式动画和显式动画。 不管是哪种动画&#xff0c;我们都需要一个被State包装的状态属性值&#xff0c;通过这个值的改变来促使与之相关的UI刷新&#xff0c;继而执行动画。 隐式动画.ani…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19讲 串口实验UART

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Vivado IP核的快速入门 官方手册和例程

在IP Catalog中选择要使用的IP核&#xff0c;可以查看支持的器件与资料。 在设计源sources页面中选中配置完成的IP核点击右键选择 Open IP Example Design&#xff0c;等待工程加载完成即可&#xff0c;可以点击Run Simulation进行功能仿真进行IP核的学习。 参考&#xff1…

Mac Pro中的开源虚拟机UTM安装ubuntu(Applce M1,M2芯片)(1)

MacPro安装UTM 1 UTM 下载UTM虚拟机链接: https://mac.getutm.app/ 建议官网下载&#xff1a; 下载 Ubuntu Arm 64版 下载 Ubuntu Arm 64版链接: https://cn.ubuntu.com/download/server/arm 2 安装UTM 2.1 安装在mac上 2.2 点Open 2.3 建虚拟机### 2.4 点出虚拟机 2.5 O…

前端性能优化:从系统分析讲到实践策略

前言 在过去几年&#xff0c;我曾经写过几篇和性能优化相关的文章&#xff0c;例如有性能优化方法相关的&#xff0c;有性能监控相关的。但是都只关注于局部&#xff0c;没有从整体上去看待、分析性能优化。所以本文打算尝试从整体上去分析前端性能优化&#xff0c;从性能指标…

使用 RisingWave 和 Redash 处理和可视化实时数据

在创建流处理管道时&#xff0c;需要两个关键组件&#xff1a;一个用于处理和转换数据&#xff0c;一个用于数据可视化。RisingWave 和 Redash 就提供了一个优秀的解决方案。 RisingWave 是一个支持实时数据处理的分布式 SQL 流数据库。它提供增量更新的物化视图&#xff0c;使…