26.java-单元测试xml注解

单元测试&xml&注解

单元测试

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

    • 简单理解 : 就是一个测试代码的工具
  • 目前测试代码的弊端 :

    • 现在只能在main方法中测试代码, 如果一个方法的测试失败了,其他方法测试会受到影响
  • Junit 的优点 :

    • JUnit 可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法。
    • 单元测试中的某个方法测试失败了,不影响其他方法的测试。
    • 运行成功是绿色,运行失败是红色
快速入门 :
  • 认知 : Junit 测试的方法, 必须是public的, 没有参数, 没有返回值的
1. 手动导入jar包 | 在有外部网络的情况下根据提示敲回车2. 在需要测试的方法上, 加入@Test注解3. 运行绿色(正确) 红色(错误)

XML 引入

​ 配置文件

好处 :

  • 可以让项目中使用的数据, 灵活的加载和多变, 实现解耦

分类 :

  • Properties : 常用于一对一的存储
    • 键值对
    • username=root
    • password=123456
  • xml : 常用于一对多的存储

XML 介绍

​ XML的全称为(EXtensible Markup Language),是一种可扩展标记语言。

  • 标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
  • 可扩展:标签的名字是可以自己定义的
优势 :
  • 作为软件的配置文件
  • 用于进行存储数据和传输数据
    • 传输的理解, 主要还是喜欢它里面的格式

4. XML 语法

语法规则 :
  • 创建

    • 就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml
  • 文档声明

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

    <?xml version="1.0" encoding="UTF-8" ?>
    • version:该属性是必
    • encoding:该属性不是必须的
      • 打开当前xml文件的时候应j
      • 0该是使用什么字符编码表(一般取值都是UTF-8)
    • standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no
  • 标签规则

    • 必须存在一个根标签,有且只能有一个
  • 标签由一对尖括号和合法标识符组成

    <student>
    
  • 标签必须成对出现

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

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

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

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

    • XML文件可以定义注释信息:<!-注释内容–>
    • XML文件可以存在以下特殊字符
    &lt;			<  小于
    %gt;			>  大于
    &amp;			&  和号
    &apos;			’  单引号
    &quot;			”  引号
    
    • XML文件中可以存在CDATA区:<!-[CDATA[ …内容… ]]>
      • CDATA是特殊数据区,里面可以写任意
案例解析
/*需求 :  编写一个城市对应区的 xml 文件城市:  city 区域 :  area
*/

XML 约束 (了解)

这东西以后都不会自己写

介绍 :
  • 用来限定xml文件中可使用的标签以及属性
分类 :
  • DTD 约束
  • schema 约束
DTD 约束

编写DTD约束

  • 步骤

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

    2. 看xml文件中使用了哪些元素

      <!ELEMENT> 可以定义元素
    3. 判断元素是简单元素还是复杂元素

      简单元素:没有子元素。
      复杂元素:有子元素的元素;

  • 代码实现

    <!ELEMENT persons (person)>
    <!ELEMENT person (name,age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    
  • 引入DTD约束

    • 引入本地dtd

      <!DOCTYPE 根元素名称 SYSTEM 'DTD文件的路径'>
      
    • 在xml文件内部引入

      <!DOCTYPE 根元素名称 [ dtd文件内容 ]>
      
    • 引入网络dtd

      <!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">
      
    • 引入本地DTD约束

      // 这是persondtd.dtd文件中的内容,已经提前写好
      <!ELEMENT persons (person)>
      <!ELEMENT person (name,age)>
      <!ELEMENT name (#PCDATA)>
      <!ELEMENT age (#PCDATA)>// 在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>
      
    • 在xml文件内部引入

      <?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

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL"><persons><person><name>张三</name><age>23</age></person></persons>
      
Schema 约束
  • schema 和 dtd 的区别

    1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
    2. 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
    3. dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
    4. schema 语法更加的复杂

在这里插入图片描述

  • 编写schema约束
1. 创建一个文件,这个文件的后缀名为.xsd2. 定义文档声明3. schema文件的根标签为: <schema>4.<schema>中定义属性:xmlns=http://www.w3.org/2001/XMLSchema5.<schema>中定义属性:targetNamespace = 唯一的url地址,指定当前这个schema文件的名称空间理解: 起个名, 顺带打广告6.<schema>中定义属性:elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件7. 通过element定义元素8. 判断当前元素是简单元素还是复杂元素
引入 :
<stus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.mhys.com"xsi:schemaLocation="http://www.mhys.com stus.xsd"
><student><name>张三</name><age>23</age></student></stus>

在这里插入图片描述

XML解析

  • 解析的两种方式
    • SAX 解析
    • DOM 解析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

准备动作
  1. 导入 dom4j-1.6.1.jar 包
  2. 获取 Document 对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("day15-code\\src\\xml\\stus.xml"));
System.out.println(document);
方法介绍

在这里插入图片描述

在这里插入图片描述

示例代码
package com.itheima.start;import com.itheima.domain.Student;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) throws DocumentException, FileNotFoundException {SAXReader reader = new SAXReader();Document document = reader.read(new File("mC\\src\\xml\\stus.xml"));ArrayList<Student> list = new ArrayList<>();// 1. 获取根标签Element rootElement = document.getRootElement();// 2. 获取根标签下的所有子标签List<Element> student = rootElement.elements("student");// 3. 遍历集合for (Element element : student) {// 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(name, Integer.parseInt(age));// 8. 添加到集合list.add(stu);}list.forEach(s -> System.out.println(s));}
}

7. 注解

介绍 :

Annotation表示注解,是JDK1.5的新特性。

注解的主要作用:对我们的程序进行标注。

理解:注释是给人看的,注解是给虚拟机看的

通过注解可以给类增加额外的信息。

注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。

JDK中常见的注解 :
  • @Override:表示方法的重写

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

  • @SuppressWarnings(“all”):压制警告

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

比如:Junit

@Test 表示运行测试方法

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

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

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

  • 格式 :

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赋值”);

案例
  • 需求

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

  • 实现步骤

    1. 自定义一个注解Test,并在类中的某几个方法上加上注解
    2. 在测试类中,获取注解所在的类的Class对象
    3. 获取类中所有的方法对象
    4. 遍历每一个方法对象,判断是否有对应的注解
//表示Test这个注解的存活时间
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Test {
}public class UseTest {//没有使用Test注解public void show(){System.out.println("UseTest....show....");}//使用Test注解@Testpublic void method(){System.out.println("UseTest....method....");}//使用Test注解@Testpublic void function(){System.out.println("UseTest....function....");}
}public class AnnoDemo {public static void main(String[] args) throws tException {// 1.通过反射获取UseTest类的字节码文件对象Class clazz = Class.forName("com.itheima.myanno3.UseTest");// 创建对象UseTest useTest = (UseTest) clazz.newInstance();// 2.通过反射获取这个类里面所有的方法对象Method[] methods = clazz.getMethods();// 3.遍历数组,得到每一个方法对象for (Method method : methods) {// method依次表示每一个方法对象。// isAnnotationPresent(Class<? extends Annotation> annotationClass)// 判断当前方法上是否有指定的注解。// 参数:注解的字节码文件对象// 返回值:布尔结果。  true 存在  false 不存在if(method.isAnnotationPresent(Test.class)){method.invoke(useTest);}}}
}
元注解 (了解)
  • 概述

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

  • 元注解介绍

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

​ 作用:用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置。

​ 可使用的值定义在ElementType枚举类中,常用值如下

  • TYPE,类,接口
  • FIELD, 成员变量
  • METHOD, 成员方法
  • PARAMETER, 方法参数
  • CONSTRUCTOR, 构造方法
  • LOCAL_VARIABLE, 局部变量
Retention:

​ 作用:用来标识注解的生命周期(有效范围)

​ 可使用的值定义在RetentionPolicy枚举类中,常用值如下

  • SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在
  • CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值
  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段

常用注解

@Component 控制反转

控制反转,启动服务器时框架帮我创建该注解修饰的类对象,并放入容器

衍生注解:

  • @Controller/@RestController (标注在控制层类上)
  • @Service (标注在业务层类上)
  • @Repository (标注在数据访问层类上)

@Autowired 依赖注入

依赖注入:程序运行时根据该属性的类型去容器中找对象,反射赋值给当前变量

用来标识注解使用的位置,如果没有使用该注解标识,则自定义的注解可以使用在任意位置。

​ 可使用的值定义在ElementType枚举类中,常用值如下

  • TYPE,类,接口
  • FIELD, 成员变量
  • METHOD, 成员方法
  • PARAMETER, 方法参数
  • CONSTRUCTOR, 构造方法
  • LOCAL_VARIABLE, 局部变量
Retention:

​ 作用:用来标识注解的生命周期(有效范围)

​ 可使用的值定义在RetentionPolicy枚举类中,常用值如下

  • SOURCE:注解只作用在源码阶段,生成的字节码文件中不存在
  • CLASS:注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值
  • RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段

常用注解

@Component 控制反转

控制反转,启动服务器时框架帮我创建该注解修饰的类对象,并放入容器

衍生注解:

  • @Controller/@RestController (标注在控制层类上)
  • @Service (标注在业务层类上)
  • @Repository (标注在数据访问层类上)

@Autowired 依赖注入

依赖注入:程序运行时根据该属性的类型去容器中找对象,反射赋值给当前变量

注意:需要两个实体对象都在容器中才能实现

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

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

相关文章

2024年2月20日v1.0.5更新·优雅草便民工具youyacao-tools

2024年2月20日v1.0.5更新优雅草便民工具youyacao-tools apk下载 https://fenfacun.youyacao.com/tools105.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益工具&#xff0c;2024年1月17日正式发布v1.0.0版本&#xff0c;本工具为了方便大众免…

mysql优化指南之优化篇

二、优化 现在的理解数据库优化有四个维度&#xff0c;分别是&#xff1a; 硬件升级、系统配置、表结构设计、SQL语句及索引。 那优化的成本和效果分别如下&#xff1a; 优化成本&#xff1a;硬件升级>系统配置>表结构设计>SQL语句及索引。 优化效果&#xff1a;…

Linux环境安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

RabbitMQ 面试八股题整理

前言&#xff1a;本文是博主网络自行收集的一些RabbitMQ相关八股文&#xff0c;还在准备暑期实习&#xff0c;后续应该会持续更新...... 参考&#xff1a;三天吃透RabbitMQ面试八股文_牛客网 目录 RabbitMQ概述 什么是 RabbitMQ&#xff1f; 说一说RabbitMQ中的AMQP 为什么…

zabbix监控业务数据

前言 监控系统除了监控os和数据库性能相关的指标外&#xff0c;业务数据也是重点监控的对象。 一线驻场的运维同学应该深有体会&#xff0c;每天需要向甲方或者公司反馈现场的数据情况&#xff0c;正常情况下一天巡检两次&#xff0c;早上上班后和下午下班前各一次。监控项目…

【C语言】指针初阶

正文开始之前&#xff0c;我们要记住一个东西就是&#xff1a;地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、…

数据结构:链表的冒泡排序

法一&#xff1a;修改指针指向 //法二 void maopao_link(link_p H){if(HNULL){printf("头节点为空\n");return;}if(link_empty(H)){printf("链表为空\n");return;}link_p tailNULL;while(H->next->next!tail){link_p pH;link_p qH->next;while(q…

CUDA C:核函数、主机函数、设备函数

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 核函数(Kernel Function)指的是在主机(CPU)调用&#xff08;某些情况下也可以在设备调用&#xff09;&#xff0c;在设备(GPU)上执行的函数&#xff0c;使用__global__…

YOLOv8改进 | Conv篇 | 全新的SOATA轻量化下采样操作ADown(参数量下降百分之二十,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)…

liunx前后端分离项目部署

文章目录 1、nginx的安装和自启动2.nginx负载均衡3.前后端项目部署-后端部署4.前后端项目部署-前端部署 1、nginx的安装和自启动 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel1.安装我们nginx所需要的依赖 wget http://nginx.org/download/nginx-1.…

Open3D 点云法向量计算与可视化 (25)

Open3D 点云法向量计算与可视化 (25) 一、算法原理二、算法实现三、可视化显示和长度调节一、算法原理 通常计算点云的法向量可以使用以下两种常见的方法: 最小二乘法(Least Squares Method):该方法通过拟合局部表面的平面来计算法向量。对于给定点周围的邻域,可以通过…

故障排除:Failed to load SQL Modules into database Cluster

PostgreSQL 安装和故障排除 重新安装前的准备工作 在重新安装 PostgreSQL 之前&#xff0c;确保完成以下步骤&#xff1a; 重新卸载 PostgreSQL 并重启电脑。 删除以下目录&#xff1a; C:\Program Files\PostgreSQL\13C:\Users\admin\AppData\Roaming\pgadmin 重启安装过…

【计算机网络】传输层——TCP和UDP详解

文章目录 一. TCP和UDP简介二. UDP 协议详解1. UDP报文格式2. UDP的使用场景 三. TCP 协议详解1. TCP报文格式2. TCP协议的重要机制确认应答&#xff08;保证可靠传输的最核心机制&#xff09;超时重传连接管理&#xff08;三次握手、四次挥手&#xff09;&#xff01;&#xf…

内网设备如何在互联网上能访问

应用场景 设备安装到了客户现场&#xff0c;如果要调试设备&#xff0c;当前的处理方式是技术人员出差到客户现场、让客户开通VPN、让客户安装远程工具&#xff0c;远程到客户计算机上进行调试等方法。人不在家里想远程家里的电脑&#xff0c;当前处理方式就是在家里电脑上安装…

【信息提取】FindSomething 浏览器插件

下载地址 FindSomething 浏览器插件 概述 在网页的源代码或js中找到一些有趣的东西 FindSomething 用于快速在网页的html源码或js代码中提取一些有趣的信息&#xff0c;包括可能请求的资源、接口的url&#xff0c;可能请求的ip和域名&#xff0c;泄漏的证件号、手机号、邮箱…

【Android12】Monkey压力测试源码执行流程分析

Monkey压力测试源码执行流程分析 Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 /development/cmds/monkey/部署形式为Java Binary # development/cmds/monkey/Android.bp // Copyright 2008 The Android Open Source Proj…

Leetcoder Day21| 回溯理论基础+组合

语言&#xff1a;Java/Go 回溯理论基础 回溯函数也就是递归函数&#xff1b; 所有回溯法的问题都可以抽象为树形结构&#xff1b; 回溯法解决的都是在集合中递归查找子集&#xff0c;集合的大小就构成了树的宽度&#xff0c;递归的深度&#xff0c;都构成的树的深度。 适用的题…

深度学习基础(一)神经网络基本原理

之前的章节我们初步介绍了机器学习相关基础知识&#xff0c;目录如下&#xff1a; 机器学习基础&#xff08;一&#xff09;理解机器学习的本质-CSDN博客 机器学习基础&#xff08;二&#xff09;监督与非监督学习-CSDN博客 机器学习基础&#xff08;四&#xff09;非监督学…

深入理解计算机系统学习笔记

2.3整数运算 有时候会发现两个正数相加会得出一个负数&#xff0c;而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。 2 .3. 1 无符号加法 原理&#xff1a; 在正…

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…