行业知识
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
-
文档声明
文档声明必须是第一行第一列
- version:该属性是必
- encoding:该属性不是必须的
- 打开当前xml文件的时候应j
- 0该是使用什么字符编码表(一般取值都是UTF-8)
- standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no
-
标签规则
- 必须存在一个根标签,有且只能有一个
-
标签由一对尖括号和合法标识符组成
-
标签必须成对出现
前边的是开始标签,后边的是结束标签
-
特殊的标签可以不成对, 但是必须有结束标记
-
标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
-
标签需要正确的嵌套
这是正确的: 张三 这是错误的: 张三
-
细节
- XML文件可以定义注释信息:
- XML文件可以存在以下特殊字符
< 大于&& 和号'’ 单引号"” 引号
- XML文件中可以存在CDATA区:
- CDATA是特殊数据区,里面可以写任意
案例解析
/*需求 : 编写一个城市对应区的 xml 文件城市: city 区域 : area*/
XML 约束 (了解)
这东西以后都不会自己写
介绍 :
- 用来限定xml文件中可使用的标签以及属性
分类 :
- DTD 约束
- schema 约束
DTD 约束
编写DTD约束
-
步骤
-
创建一个文件,这个文件的后缀名为.dtd
-
看xml文件中使用了哪些元素
可以定义元素 -
判断元素是简单元素还是复杂元素
简单元素:没有子元素。
复杂元素:有子元素的元素;
-
-
代码实现
-
引入DTD约束
-
引入本地dtd
-
在xml文件内部引入
-
引入网络dtd
-
引入本地DTD约束
// 这是persondtd.dtd文件中的内容,已经提前写好// 在person1.xml文件中引入persondtd.dtd约束 张三 23
-
在xml文件内部引入
]> 张三 23
-
引入网络dtd
张三 23
Schema 约束
-
schema 和 dtd 的区别
- schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
- 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
- dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
- schema 语法更加的复杂
- 编写schema约束
1. 创建一个文件,这个文件的后缀名为.xsd2. 定义文档声明3. schema文件的根标签为: 4. 在中定义属性: xmlns=http://www.w3.org/2001/XMLSchema 5. 在中定义属性: targetNamespace = 唯一的url地址,指定当前这个schema文件的名称空间 理解: 起个名, 顺带打广告6. 在中定义属性:elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件7. 通过element定义元素8. 判断当前元素是简单元素还是复杂元素
引入 :
张三 23
XML解析
- 解析的两种方式
- SAX 解析
- DOM 解析
准备动作
- 导入 dom4j-1.6.1.jar 包
- 获取 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 list = new ArrayList(); // 1. 获取根标签 Element rootElement = document.getRootElement(); // 2. 获取根标签下的所有子标签 List 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,用于指定类的方法上,如果某一个类的方法上使用了该注解,就执行该方法
-
实现步骤
- 自定义一个注解Test,并在类中的某几个方法上加上注解
- 在测试类中,获取注解所在的类的Class对象
- 获取类中所有的方法对象
- 遍历每一个方法对象,判断是否有对应的注解
//表示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
-
- 如果数组中只有一个属性值 , 在使用时{}是可以省略的
-
- 解析的两种方式
-
-
-
- 用来限定xml文件中可使用的标签以及属性
- CDATA是特殊数据区,里面可以写任意
- XML文件中可以存在CDATA区:
-
-
- 必须存在一个根标签,有且只能有一个
-
- 传输的理解, 主要还是喜欢它里面的格式
- Properties : 常用于一对一的存储
- 可以让项目中使用的数据, 灵活的加载和多变, 实现解耦
- 认知 : Junit 测试的方法, 必须是public的, 没有参数, 没有返回值的