java2 day02 注解 Junit

本文介绍了Java注解的基本概念及使用方法,并详细探讨了元注解的作用与自定义注解的过程。此外,还对比了JUnit3.x和JUnit4.x的不同之处,重点讲解了JUnit4.x的测试流程与断言技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解

@Override

使用注解:

   注意:注解本身不具有任何功能,得提供第三方的程序来赋予它功能.

使用注解有三方程序参与:

   1):首先必须存在一个注解类.

   2):其次必须存在被贴的程序元素(类,方法,构造器,字段,局部变量,包等).

   3):必须有第三方的程序来赋予注解特殊的功能(反射操作).

JDK自带的注解


存在的疑问:

   1):为什么有的注解允许接受参数,有的却不可以.

      比如: @SuppressWarings(value="all"),而@Override就没有.

     通过阅读各自的源代码发现,@SuppressWarings有一个value的抽象方法,其他没有.

   2):为什么有的注解可以贴在类/方法/变量上,而有的只能贴在方法上.

     元注解:

在没注解之前是通过文档注释来解决的.

元注解

注  解:用来贴在类,方法,构造器,字段,参数等之上,用于给被贴的程序元素赋予一定的功能.

元注解:在注解定义的时候,必须使用元注解来标注.元注解是注解的注解.

------------------------------------------------------------------------

@Retention:决定了注解可以保持在哪一个时期.

           一个有三个时期,都封装在RetentionPolicy枚举类中:

           SOURCE:  该注解在编译时就会丢弃,不会存在于字节码文件中,只能存在于源文件中.

           CLASS:   该注解可以存在源文件和字节码文件中,但是一旦加载进JVM,就丢失.

           RUINTIME:该注解可以存在源文件,字节码,JVM中.

自定义的注解类,都是要RUNTIME,因为我们需要在运行时期通过反射赋予注解特殊的功能.

------------------------------------------------------------------------

@Target:  决定了注解可以贴在哪些成员元素之上.

          可以被贴的成员元素有很多,都封装在ElementType枚举类中.

ElementType.ANNOTATION_TYPE只能修饰Annotation

ElementType.CONSTRUCTOR    只能修饰构造方法

ElementType.FIELD        只能修饰字段(属性),包括枚举常量

ElementType.LOCAL_VARIABLE只能修饰局部变量

ElementType.METHOD       只能修饰方法

ElementType.PACKAGE      只能修饰包(极少使用)

ElementType.PARAMETER    只能修饰参数

ElementType.TYPE         只能修饰类,接口,枚举

------------------------------------------------------------------------

了解:

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

@Inherited:   @Inherited标注的标签可以被子类所继承/遗传.

@Inherited

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@interface OOXX{}

@OOXX

public classSuperClass{}

public class SubClass extends SuperClass{}

此时,即使不给SubClass标注OOXX注解,但是通过反射依然可以返现SubClass上有OOXX注解.

注解的定义和使用

常用的API:

AnnotationgetAnnotation(Class annotationClass):

   判断当前类/方法/字段上是否拥有指定的注解.

   若没有返回null,若有,返回当前注解对象.

Annotation[]getAnnotations():获取当前之上所有的注解

booleanisAnnotationPresent(Class annotationClass)

判断当前成员之上,是否存在指定的一个注解.

    若存在,返回true.否则返回false.



import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

@VIP(age = 0, name = "tt",love={"java","c","playgame"},sex=Gender.NONE)
class Person{	
}



public class AnnoDemo {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws NoSuchMethodException 
	 */
	public static void main(String[] args) throws NoSuchMethodException, Exception {
		Class clz = Person.class;
		Annotation[] a = clz.getAnnotations();
		for (Annotation as : a) {
			System.out.println(as);
		}
		Annotation a1 = clz.getAnnotation(VIP.class);
		VIP V = (VIP)a1;
		System.out.println(V.age());
		System.out.println(V.name());
		System.out.println(V.sex());
		
		System.out.println("-------------------");
		//获取ddd方法上的注解
		Class clszz = AnnoDemo.class;
		Method m1 = clszz.getMethod("ddd");
		System.out.println(m1);
		Deprecated dep = m1.getAnnotation(Deprecated.class);
		System.out.println(dep);
		
		
	}
	@Deprecated
	public static void ddd(){
		
	}
}
模拟junit4.x

//TODO


测试

软件测试:软件不是开放出来的,是测试出来的.

软件工程师:

软件测试黑盒测试/灰盒测试/白盒测试

黑盒测试:专门的软件测试人员来做(边缘思想).

黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。

在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,

它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。

黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。

很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的

作用:

黑盒测试法注重于测试软件的功能需求,主要试图发现下列几类错误。

功能不正确或遗漏;

界面错误;

输入和输出错误;

数据库访问错误;

性能错误;

初始化和终止错误等

白盒测试:开放人员来测试

又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试

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

检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,

设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。

"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

--------------------------------------------------

单元测试,就属于白盒测试.

 ---->JUnit:

        JUnit3.x

        JUnit4.x

JUnit3.x

junit3.x是Java5以前的测试方式:

   在Android中的单元测试就是采用的是junit3.x;

步骤:

     1.把junit3.x的测试jar,添加到该项目中来;(添加如上图)

     2.定义一个测试类,并让该测试类继承于TestCase类.

       测试类的名字:XxxTest,Xxx表示一个对象或者一个模块.

     3.在EmployeeDAOTest中编写测试方法:如

       public void testXxx() throws Exception {

         }

       注意:方法是public修饰的,无返回的,必须以test作为方法的前缀,Xxx表示测试的功能名字.

       温馨提示:输入test,按atl+/,再敲回车,就有测试方法,再修改方法的名字.

      4.选择某一个测试方法,鼠标右键选择 [run asjunit],或则选中测试类,表示测试该类中所有的测试方法.

      若要在测试方法之前做准备操作:

      EmployeeDAOTest覆写TestCase中:protected voidsetUp() throws Exception方法

      若要在测试方法之后做回收操作:

      EmployeeDAOTest覆写TestCase中:protected voidtearDown() throws Exception方法

      执行顺序:setUp->测试方法->tearDown-->setUp--测试方法2->tearDown

JUnit4.x

   junit4.x基于Java5开始的版本,支持注解.

步骤:

     1.把junit4.x的测试jar,添加到该项目中来;

     2.定义一个测试类.(不再继承TestCase类)

       测试类的名字: XxxTest

     3.在EmployeeDAOTest中编写测试方法:如

       @Test

       public void testXxx() throws Exception {

         }

      注意:方法是public修饰的,无返回的,该方法上必须贴有@Test标签,XXX表示测试的功能名字.

      4.选择某一个测试方法,鼠标右键选择 [run asjunit],或则选中测试类,表示测试该类中所有的测试方法.

      以后单元测试使用最多的方式:

      若要在测试方法之前做准备操作:

      EmployeeDAOTest随意定义一个方法并使用@Before标注:

      @Before

      public void xx() throws Exception方法

      若要在测试方法之后做回收操作:

      EmployeeDAOTest随意定义一个方法并使用@After标注:

      @After

   public void xx() throws Exception方法

     特点:每次执行测试方法之前都会执行Before方法,每次执行测试方法之后都会执行After方法;

      有没有方式之初始化一次,和最终销毁一次呢?

      @BeforeClass标签:在所有的Before方法之前执行,只在最初执行一次.只能修饰静态方法

     @AfterClass标签:在所有的After方法之后执行,只在最后执行一次.  只能修饰静态方法

      执行顺序:BeforeClass->(Before->Test-After多个测试方法)-->AfterClass

使用断言来做测试

使用断言来做测试:

    断言是否正确:

         若正确:输出绿条.

         若失败:输出红条.

    如何判断断言的正确还是失败.

         期望值和真实值是否相等.

             若相等:断言成功.

             若不等:断言失败.

---------------------------------------------------------------

在你不知道如何做测试的情况下,就不要做设计.   测试先行.(先把测试编写,再写实现)

断言:

①:Assert.assertEquals(message, expected,actual):比较的值

   三个参数:

     message: 断言失败的提示信息,断言成功不会显示.

     expected: 期望值

     actual:  真实值

   若真实值和期望值想等,则断言成功.--->绿条

②:Assert.assertSame(message,expected, actual):   比较地址,是同一个对象

   Assert.assertNotSame(message, expected,actual):断言不是同一个对象

③:Assert.assertTrue(message,condition):断言condition应该为TRUE.

④:Assert.assertFalse(message,condition):断言condition应该为FALSE.

⑤:Assert.assertNull(message,object):断言对象object为null.

⑥:Assert.assertNotNull(message,object):断言对象object不为null.

⑦:@Test(expected=ArithmeticException.class)

   期望该方法报错,报错ArithmeticException.

⑧:@Test(timeout=400)

   期望该方法在400毫秒之内执行完成.

XML

XML(eXtensibleMarkup Language),是一种可扩展的标记语言,类似HTML。

XML技术是W3C组织(World WideWeb Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。

XML被广泛认为是继Java之后在Internet上最激动人心的新技术。

HTML: 显示页面,网页.  学习里面自带的标签<html>

XML:  传输数据,而非显示数据/少量数据存储

XML标签没有被预定义,需要用户自行定义标签

---------------------------------------------------------------------------------

为什么要学XML:

XML是一种通用的数据交换格式 

许多系统的配置文件都使用XML格式

JSP文档也逐步向XML语法格式过渡

许多项目都采用XML作为数据交换格式

在日常应用中会经常看见XML格式的文件

掌握XML是软件开发人员的一项基本技能

Struts1.x,struts2.x,spring,hibernate,mybatis任意一个javaee框架中都要用到XML

-----------------------------------------------------------------------------------

XML结构清晰(树状结构),不仅让人能够明白,还让计算机也能够明白。

XML作为一种公订的、开放的标准,不受知识产权的限制.

XML有两个编码:  要保证两个编码相同,都为UTF-8.

内容编码:

文件本身的编码:

一个XML文档必须有且仅有一个根标签,不允许交叉嵌套,区分大小写

---------------------------------------------------------------------------------

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

最简单的语法:

  如:<?xmlversion="1.0"?>

用encoding属性说明文档所使用的字符编码,默认为UTF-8。保存在磁盘上的文件编码要与声明的编码一致。

  如:<?xmlversion="1.0" encoding="UTF-8"?>

用standalone属性说明文档是否独立,即是否依赖其他文档。

  如:<?xmlversion="1.0" standalone="yes"?>

---------------------------------------------------------------------------------

CDATA是Character Data的缩写

作用:把标签当做普通文本内容;

语法:<![CDATA[数据内容]]>

作用:

解析器不对CDATA区中的内容进行解析,而是将这些数据原封不动地交给程序去处理。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值