0


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. 创建一个文件,这个文件的后缀名为.dtd2. 看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文件中的内容,已经提前写好<!ELEMENTpersons(person)><!ELEMENTperson(name,age)><!ELEMENTname(#PCDATA)><!ELEMENTage(#PCDATA)>// 在person1.xml文件中引入persondtd.dtd约束<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEpersonsSYSTEM'persondtd.dtd'><persons><person><name>张三</name><age>23</age></person></persons>- 在xml文件内部引入<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEpersons[<!ELEMENTpersons(person)><!ELEMENTperson(name,age)><!ELEMENTname(#PCDATA)><!ELEMENTage(#PCDATA)>]><persons><person><name>张三</name><age>23</age></person></persons>- 引入网络dtd<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEpersonsPUBLIC"dtd文件的名称""dtd文档的URL"><persons><person><name>张三</name><age>23</age></person></persons>
Schema 约束
  • schema 和 dtd 的区别1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd2. 一个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/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 =newSAXReader();Document document = reader.read(newFile("day15-code\\src\\xml\\stus.xml"));System.out.println(document);
方法介绍

在这里插入图片描述

在这里插入图片描述

示例代码
packagecom.itheima.start;importcom.itheima.domain.Student;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[] args)throwsDocumentException,FileNotFoundException{SAXReader reader =newSAXReader();Document document = reader.read(newFile("mC\\src\\xml\\stus.xml"));ArrayList<Student> list =newArrayList<>();// 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 =newStudent(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@interfaceAnno{Stringshow()default"show...";}

属性类型 :

  • 基本数据类型
  • String
  • Class
  • 注解
  • 枚举
  • 以上类型的一维数组
public@interfaceMyAnno{publicstaticfinalint num1 =100;publicstaticfinalString num2 ="abc";publicstaticfinalMyAnno num3 =null;publicstaticfinalClass num4 =String.class;publicstaticfinalint[] num5 ={};publicabstractStringshow1()default"show1";publicabstractintshow2()default132;publicabstractMyAnno2show3()default@MyAnno2;publicabstractClassshow4()defaultString.class;publicabstractint[]show5()default{1,2,3};}
public@interfaceMyAnno{int num1 =100;String num2 ="abc";MyAnno num3 =null;Class num4 =String.class;int[] num5 ={};Stringshow1()default"123";intshow2()default132;MyAnno2show3()default@MyAnno2;Classshow4()defaultString.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@interfaceTest{}publicclassUseTest{//没有使用Test注解publicvoidshow(){System.out.println("UseTest....show....");}//使用Test注解@Testpublicvoidmethod(){System.out.println("UseTest....method....");}//使用Test注解@Testpublicvoidfunction(){System.out.println("UseTest....function....");}}publicclassAnnoDemo{publicstaticvoidmain(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 依赖注入

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

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

标签: java 单元测试 xml

本文转载自: https://blog.csdn.net/qq_71116105/article/details/135794422
版权归原作者 猪崽早点睡 所有, 如有侵权,请联系我们删除。

“26.java-单元测试&xml&注解”的评论:

还没有评论