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. 创建一个文件,这个文件的后缀名为.xsd

2. 定义文档声明

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

4.<schema>中定义属性:
        xmlns=http://www.w3.org/2001/XMLSchema
        
5.<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注解
    @Test
    public void method(){
        System.out.println("UseTest....method....");
    }

    //使用Test注解
    @Test
    public 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 依赖注入

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…

linux---安使用nginx

目录 一、编译安装Nginx 1、关闭防火墙&#xff0c;将安装nginx所需要软件包传到/opt目录下 ​编辑2、安装依赖包 3、创建运行用户、组 4、编译安装nginx 5、创建软链接后直接nginx启动 ​编辑 6、创建nginx自启动文件 ​编辑6.1 重新加载配置、设置开机自启并开启服务…

中国象棋开源人工智能程序(带UI)搬运

我的老父亲一直想买一个人工智能象棋机器人陪他下棋&#xff0c;我就在Github上找了一个开源项目&#xff0c;带UI的中国象棋人工智能程序&#xff0c;其训练方法类似AlphaZero&#xff0c;因而叫Chinese Chess Zero (cczero)。虽然看起来很久没有维护了&#xff0c;但是棋力也…

Spring 容器、核心容器总结

目录 创建容器获取 bean容器类层次结构图核心容器总结容器相关bean 相关依赖注入相关 创建容器 方式一&#xff1a; 类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");方式二&#xff1a; 文件路径加载配…

JS之BOM和POM

JS之BOM和POM 目录 JS之BOM和POM什么是BOM 什么是DOMBOMwindow.open(url,name,specs,replace)window.close()window.alert(message)window.confirm(message)window.prompt(message, defaultText)window.setTimeout(function, milliseconds, arguments)window.setInterval(funct…

自定义神经网络二之模型训练推理

文章目录 前言模型概念模型是什么&#xff1f;模型参数有哪些神经网络参数案例 为什么要生成模型模型的大小什么是大模型 模型的训练和推理模型训练训练概念训练过程训练过程中的一些概念 模型推理推理概念推理过程 总结 前言 自定义神经网络一之Tensor和神经网络 通过上一篇…

Java中PDF文件传输有哪些方法?

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

Redis 多规则限流和防重复提交方案实现

Redis 如何实现限流的&#xff0c;但是大部分都有一个缺点&#xff0c;就是只能实现单一的限流&#xff0c;比如 1 分钟访问 1 次或者 60 分钟访问 10 次这种&#xff0c; 但是如果想一个接口两种规则都需要满足呢&#xff0c;项目又是分布式项目&#xff0c;应该如何解决&…

飞天使-linux操作的一些技巧与知识点7-devops

文章目录 简述devopsCICD 简述devops 让技术团队&#xff0c;运维&#xff0c;测试等团队实现一体式流程自动化 进阶版图 CICD 持续集成&#xff0c; 从编译&#xff0c;测试&#xff0c;发布的完成自动化流程 持续交付&#xff0c;包含持续集成&#xff0c;并且将项目部署…

2023年总结与2024展望

今天是春节后上班第一天&#xff0c;你懂的&#xff0c;今天基本上是摸鱼状态&#xff0c;早上把我们负责的项目的ppt介绍完善了一下&#xff0c;然后写了一篇技术文章&#xff0c;《分布式系统一致性与共识算法》。接着就看了我近几年写的的年度总结&#xff0c;我一般不会在元…

K线实战分析系列之八:十字星——容易识别的特殊形态

K线实战分析系列之八&#xff1a;十字星——容易识别的特殊形态 一、十字启明星和十字黄昏星二、弃婴底部形态和弃婴顶部形态三、总结十字启明星和十字黄昏星形态的要点 一、十字启明星和十字黄昏星 当开盘价与收盘价极为接近的时候&#xff0c;当期的K线就呈现为一根十字线&am…

01|Mysql底层存储引擎

1. 聚集索引&#xff08;聚簇&#xff09;与非聚集索引 1.1 聚集索引 索引和数据存储在一起。叶子节点存储了完整的数据记录&#xff1b; 1.2 非聚集索引 MyISAM存储引擎就是非聚集索引&#xff0c;索引和数据文件是分开存储的。索引在MYI文件中&#xff0c;数据在MYD文件中…

蓝桥杯-数字三角形

原题链接&#xff1a;用户登录 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和 (路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述 输入的第…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

Jmeter分布式测试必踩坑,全部帮你排雷

在jmeter分布式环境部署上&#xff0c;有很同学都遇到了不少问题&#xff0c;就算是看过安装教程&#xff0c;也会在实际操作的时候一脸懵&#xff0c;经常的状态是就是&#xff1a;眼睛会了手不会。 所以我们把大家容易出问题的地方总结出来&#xff0c;一起来看看吧&#xff…

5个免费文章神器,用来改写文章太方便了

在当今信息爆炸的时代&#xff0c;内容创作和编辑是网络世界中至关重要的环节。然而&#xff0c;有时候我们可能会遇到一些内容需要进行改写或者重组的情况。为了提高效率&#xff0c;让这一过程更加顺畅&#xff0c;我们可以借助一些免费的文章神器来帮助我们完成这一任务。下…

板块一 Servlet编程:第七节 ServletContext对象全解与Servlet三大域对象总结 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第七节 ServletContext对象全解与Servlet三大域对象总结 一、什么是ServletContext对象二、获取ServletContext对象及常用方法&#xff08;1&#xff09;获取 ServletContext 对象&#xff08;2&#xff09;ServletContext对象提供的方法 三、se…

pytorch自定义数据集分类resnet18

# 文件结构为&#xff1a; # |--- data # |--- dog # |--- dog1_1.jpg # |--- dog1_2.jpg # |--- cat # |--- cat2_1.jpg # |--- cat2_2.jpg import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import to…

【软件测试面试】要你介绍项目-如何说?完美面试攻略...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试面试时&am…

UI风格汇:扁平化风格来龙去脉,特征与未来趋势

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的扁平化风格的解读&#xff0c;有设计需求&#xff0c;我们也可以接单。 一、什么是扁平化风格 扁平化风格…