美文网首页
Annotation&Junit

Annotation&Junit

作者: NextGame | 来源:发表于2016-06-07 00:58 被阅读33次

注解测试XML

1. 什么是注解

所有的Annotation都是java.lang.annotation.Annotation接口的子接口,所以Annotation是一种特殊的接口(枚举是特殊的类);

@interface Override{} ---> interface Override extends java.lang.annotation.Annotation{}

所有的枚举类,都是java.lang.Enum类的子类。

enum Gender{} ---> class Gender extends java.lang.Enum{}

注解被用来为程序元素(类,方法成员变量等)设置元数据。

注解,标签,Annotation都是一体。

使用注解需要三方面的参与

1.要有一个注解

2.被贴的程序元素

3.需要第三方程序参数,赋予注解特殊的功能

注解:主要是用来描述程序元素,和xml的功能是一样的,都是用来实现配置信息


2.JDK中内置的注解

常用注解:

@Override 限定重写父类的方法

@Deprecated 标记已过时的成员,不推荐使用

@SuppressWarings 抑制编译器发出的警告代码的问题任然存在,只是把警告消除了而已**

@SafeVarargs 抑制堆污染警告(JAVA7开始出现的)堆污染:当方法中有泛型和可变参数的时候,可能出现堆污染警告


3. JDK中的元注解

注解:描述数据的数据

元注解:描述注解的注解

@Retention 表示注解可以保存在哪一个时期,保存的时期值封装在RetentionPolicy枚举类中,第三方的程序通常是使用反射(在运行时期生效)来赋予特殊的功能,如果注解都不能保存到运行时期,那么反射是获取不到对应的注解。

@Target 表示注解可以贴在哪些位置(类,方法,构造器等等).位置的常量封装在ElementType枚举类中**

enum ElementType {
    ElementType.ANNOTATION_TYPE // 只能修饰Annotation
    ElementType.CONSTRUCTOR // 只能修饰构造器方法
    ELementType.FIELD // 只能修饰字段(属性),包括枚举常量
    ElementType.LOCAL_VARIABLE // 只能修饰局部变量
    ElementType.METHOD // 只能修饰方法
    ELementType.PACKAGE // 只能修饰包(极少使用)
    ElementType.PARAMETER // 只能修饰参数
    ElementType.TYPE // 只能修饰类,接口,枚举
}

@Documented 使用@Document标注的标签会保存到API文档中。

@Inherited 标注的标签可以被子类继承

Java代码中的三种状态

Java代码的三种状态详解


4.自定义注解

@Target({ ElementType.TYPE, ElementType.METHOD }) // 可以使用在类,接口,枚举,以及方法
@Retention(RetentionPolicy.RUNTIME) // 保存到运行时
public @interface MyAnno {
  String value();
  int age() default 18;
  Gender sex() default Gender.OTHER;
}

注意:

**
1.注解中属性的类型:
**

基本数据类型,String,Class,注解,枚举,一位数组

**2.注解中如果需要给value属性传值,那么可以省略掉value(前提是只有value这么一个属性)
**


5.注解的定义和使用

1.定义注解:

@Target(ElementType.Type) // 表明只能贴在类,接口或者枚举中
@Retention(RetentionPolicy.RUNTIME) // 表明存在的时期,是在Runtime的时候
public @interface 注解名 {
  String value(); // 必须使用抽象方法,在直接中,我们称之为属性,属性使用名词表示
  int age() default 18; // 设置默认值
}

注意:

数据只能是:基本数据类型,String,Class,Annotation,Enum,数组

2.使用注解:

  @注解名词,但是上面那个只能贴在Target所规定的范围中

3.获取注解:

因为注解可以贴在类,构造器,方法,字段等上面。所以可以在Class,Constructor,Field,Method类中,有操作注解相关的方法:

public boolean isAnnotationPresent(Class annotationClass); // 判断该成员上是否有指定的注解标注。

public Annotation getAnnotation(Class annotationClass); // 获取该成员上的指定的注解

public Annotation[] getAnnotation(); // 获取该成员上所有的注解

示例代码

@MyAnno(value = "Frank", age = 18)
public class MyAnnoDemo {
  public static void main(String[] args) {
    // 获取到MyAnnoDemo类的字节码对象
    Class clz = MyAnnoDemo.class;
    // 判断当前类上是否有MyAnno注解
    if (clz.isAnnotationPresent(MyAnno.class)) {
      Annotation annotation = clz.getAnnotation(MyAnno.class);
      // 可以直接强转一下
      MyAnno anno = (MyAnno) annotation;
      System.out.println(anno.value());
      System.out.println(anno.age());
      System.out.println(anno.sex());
    }
  }
}

注意:MyAnno记得加上Retention(RetentionPolicy.RUNTIME),否则运行之后就没有注释效果了

6.单元测试

黑盒测试

只检查程序功能是否按照<u>需求规格说明</u>的规定正常使用,程序是否能适当地接受<u>输入数据</u>而昌盛正确的<u>输出信息</u>

白盒测试

按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照<u>设计规格说明书</u>的规定正常进行


7.Junit3.x测试环境搭建

步骤:
1.导入Junit3.x的jar包
2.创建一个测试类JUnit3Test,继承TestCast类
3.定义一个测试方法(替代了以前的main方法)
  要求:必须是公共的,无法回值,方法名称必须是test为前缀,无参数。
4.在测试方法之前,执行初始化操作(这种代码只需要写一次)
5.在测试方法之后,执行资源销毁操作(这种代码只需要写一次)
6.快速生成测试方法:
  输入test3,代码提示,回车


8.Junit4.x测试环境搭建

//1.导入Junit4.x的jar包
//2.创建一个测试类JUnit4Test
//3.定义一个测试方法(替代了以前的主方法main)
 // 要求:必须是公共的,无返回值,无参数。
//4.在测试方法之前,执行了初始化操作(这种代码只需要写一次)
//5.在测试方法之后,执行资源销毁操作(这种代码需要写一次)
//6.快速生成测试方法:输入test,代码提示,回车
//7.在执行所有的测试方法之前需要执行一次(方法必须是静态的)
@BeforClass
public static void first() {
  System.out.println("在最开始的时候执行一次");
}
//8.在执行的所有测试方法之后需要执行一次(方法必须是静态的)
@AfterClass
public static void end() {
  System.out.println("在最后的时候执行一次");
}


9.使用断言做测试

测试的步骤

1.定义一个接口:IMath
2.定义一个IMath的实现类:MathImpl
3.完成测试代码
4.完成实现类

使用 <u>断言</u> 做测试

核心类:Assert

断言需要:期望值,真实值

在Eclipse中,断言成功,使用绿条表示,反之使用红条。

Assert.assertEquals(message, expected, actual);
// message : 断言失败的提示信息,成功不会提示
// expected : 期望值
// actual : 真实值 

10.XML

定义

XML,是一种可扩展的标记语言。

在编写XML文档时,需要先使用文档声明来声明xml文档。并且必须出现在文档的第一行

<?xml version="1.0"?>

11.获取Document对象

获取Document对象的步骤:

// 1.确定文件的位置
File file = new File("文件的绝对路径");
// 2.创建DocumentBuilderFactory工程类的对象(工厂类中往往体现着单例模式)
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
// 3.通过工厂类对象创建DocumentBuilder对象
DocumentBuilder builder = fac.newDocumentBuilder();
// 4.通过DocumentBuilder对象创建Document对象
Document doc = builder.parse(file);

12.使用DOM读取XML中的信息

// 获取到需要解析的XML文件
File file = new File("contracts.xml");
// 获取到Document对象用来解析XML文件
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
// 直接读取到文件中的linkman节点
NodeList linkmanList = doc.getElementsByTagName("linkman");
// 使用循环遍历linkmanList中的东西
for (int i = 0 ; i < linkmanList.getLength(); i++) {
  // 这里直接强转成Element,因为上面使用的是getElements,实际上是要使用Element.getAttribute的方法
  Element ele = linkmanList.item(i);
  // 输出第一个联系人的id
  System.out.println("第一个联系人的id-->" + ele.getAttribute("id"));
  // 继续遍历该联系人下的name,email,address,group属性
  // 使用getChildNodes()方法
  NodeList childNodes = item.getChildNodes();
  for (int j = 0; j < childNodes.getLength(); j++) {
    // 遍历里面的Nodes
    Node node = childNodes.item(j);
    // 对每个Node的类型进行判断,如果是ELEMENT_NODE(元素节点),就是我们要找的
    if (node.getNodeType == Node.ELEMENT_NODE) {
      // 强转一下,因为要获取到节点中的内容
      Element ele = (Element) node;
      // 判断这个节点名称是什么name,email,address,group
      if (ele.getNodeName().equals("name")) {
        System.out.println("联系人的姓名-->" + ele.getTextContent());
      } else if (ele.getNodeName.equals("email")) {
        System.out.println("联系人的邮箱-->" + ele.getTextContent());
      }
      // ... 剩下的address,group就不在过多的演示了
    }
  }
}

相关文章

网友评论

      本文标题:Annotation&Junit

      本文链接:https://www.haomeiwen.com/subject/vlsddttx.html