Annotation&Junit

注解測試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{}

注解被用來為程序元素(類苛吱,方法成員變量等)設(shè)置元數(shù)據(jù)吹泡。

注解骤星,標(biāo)簽,Annotation都是一體爆哑。

使用注解需要三方面的參與

1.要有一個注解

2.被貼的程序元素

3.需要第三方程序參數(shù)洞难,賦予注解特殊的功能

注解:主要是用來描述程序元素,和xml的功能是一樣的,都是用來實現(xiàn)配置信息


2.JDK中內(nèi)置的注解

常用注解:

@Override 限定重寫父類的方法

@Deprecated 標(biāo)記已過時的成員揭朝,不推薦使用

@SuppressWarings 抑制編譯器發(fā)出的警告代碼的問題任然存在队贱,只是把警告消除了而已**

@SafeVarargs 抑制堆污染警告(JAVA7開始出現(xiàn)的)堆污染:當(dāng)方法中有泛型和可變參數(shù)的時候色冀,可能出現(xiàn)堆污染警告


3. JDK中的元注解

注解:描述數(shù)據(jù)的數(shù)據(jù)

元注解:描述注解的注解

@Retention 表示注解可以保存在哪一個時期,保存的時期值封裝在RetentionPolicy枚舉類中柱嫌,第三方的程序通常是使用反射(在運行時期生效)來賦予特殊的功能锋恬,如果注解都不能保存到運行時期,那么反射是獲取不到對應(yīng)的注解编丘。

@Target 表示注解可以貼在哪些位置(類与学,方法,構(gòu)造器等等).位置的常量封裝在ElementType枚舉類中**

enum ElementType {
    ElementType.ANNOTATION_TYPE // 只能修飾Annotation
    ElementType.CONSTRUCTOR // 只能修飾構(gòu)造器方法
    ELementType.FIELD // 只能修飾字段(屬性)嘉抓,包括枚舉常量
    ElementType.LOCAL_VARIABLE // 只能修飾局部變量
    ElementType.METHOD // 只能修飾方法
    ELementType.PACKAGE // 只能修飾包(極少使用)
    ElementType.PARAMETER // 只能修飾參數(shù)
    ElementType.TYPE // 只能修飾類癣防,接口,枚舉
}

@Documented 使用@Document標(biāo)注的標(biāo)簽會保存到API文檔中掌眠。

@Inherited 標(biāo)注的標(biāo)簽可以被子類繼承

Java代碼中的三種狀態(tài)

Java代碼的三種狀態(tài)詳解


4.自定義注解

@Target({ ElementType.TYPE, ElementType.METHOD }) // 可以使用在類蕾盯,接口,枚舉蓝丙,以及方法
@Retention(RetentionPolicy.RUNTIME) // 保存到運行時
public @interface MyAnno {
  String value();
  int age() default 18;
  Gender sex() default Gender.OTHER;
}

注意:

**
1.注解中屬性的類型:
**

基本數(shù)據(jù)類型级遭,String,Class渺尘,注解挫鸽,枚舉,一位數(shù)組

**2.注解中如果需要給value屬性傳值鸥跟,那么可以省略掉value(前提是只有value這么一個屬性)
**


5.注解的定義和使用

1.定義注解:

@Target(ElementType.Type) // 表明只能貼在類丢郊,接口或者枚舉中
@Retention(RetentionPolicy.RUNTIME) // 表明存在的時期,是在Runtime的時候
public @interface 注解名 {
  String value(); // 必須使用抽象方法医咨,在直接中枫匾,我們稱之為屬性,屬性使用名詞表示
  int age() default 18; // 設(shè)置默認(rèn)值
}

注意:

數(shù)據(jù)只能是:基本數(shù)據(jù)類型拟淮,String干茉,Class,Annotation很泊,Enum角虫,數(shù)組

2.使用注解:

  @注解名詞,但是上面那個只能貼在Target所規(guī)定的范圍中

3.獲取注解:

因為注解可以貼在類委造,構(gòu)造器戳鹅,方法,字段等上面昏兆。所以可以在Class,Constructor,Field,Method類中枫虏,有操作注解相關(guān)的方法:

public boolean isAnnotationPresent(Class annotationClass); // 判斷該成員上是否有指定的注解標(biāo)注。

public Annotation getAnnotation(Class annotationClass); // 獲取該成員上的指定的注解

public Annotation[] getAnnotation(); // 獲取該成員上所有的注解

示例代碼

@MyAnno(value = "Frank", age = 18)
public class MyAnnoDemo {
  public static void main(String[] args) {
    // 獲取到MyAnnoDemo類的字節(jié)碼對象
    Class clz = MyAnnoDemo.class;
    // 判斷當(dāng)前類上是否有MyAnno注解
    if (clz.isAnnotationPresent(MyAnno.class)) {
      Annotation annotation = clz.getAnnotation(MyAnno.class);
      // 可以直接強轉(zhuǎn)一下
      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>需求規(guī)格說明</u>的規(guī)定正常使用模软,程序是否能適當(dāng)?shù)亟邮?lt;u>輸入數(shù)據(jù)</u>而昌盛正確的<u>輸出信息</u>

白盒測試

按照程序內(nèi)部的結(jié)構(gòu)測試程序伟骨,通過測試來檢測產(chǎn)品內(nèi)部動作是否按照<u>設(shè)計規(guī)格說明書</u>的規(guī)定正常進(jìn)行


7.Junit3.x測試環(huán)境搭建

步驟:
1.導(dǎo)入Junit3.x的jar包
2.創(chuàng)建一個測試類JUnit3Test,繼承TestCast類
3.定義一個測試方法(替代了以前的main方法)
  要求:必須是公共的燃异,無法回值携狭,方法名稱必須是test為前綴,無參數(shù)回俐。
4.在測試方法之前逛腿,執(zhí)行初始化操作(這種代碼只需要寫一次)
5.在測試方法之后,執(zhí)行資源銷毀操作(這種代碼只需要寫一次)
6.快速生成測試方法:
  輸入test3仅颇,代碼提示单默,回車


8.Junit4.x測試環(huán)境搭建

//1.導(dǎo)入Junit4.x的jar包
//2.創(chuàng)建一個測試類JUnit4Test
//3.定義一個測試方法(替代了以前的主方法main)
 // 要求:必須是公共的,無返回值忘瓦,無參數(shù)搁廓。
//4.在測試方法之前,執(zhí)行了初始化操作(這種代碼只需要寫一次)
//5.在測試方法之后耕皮,執(zhí)行資源銷毀操作(這種代碼需要寫一次)
//6.快速生成測試方法:輸入test境蜕,代碼提示,回車
//7.在執(zhí)行所有的測試方法之前需要執(zhí)行一次(方法必須是靜態(tài)的)
@BeforClass
public static void first() {
  System.out.println("在最開始的時候執(zhí)行一次");
}
//8.在執(zhí)行的所有測試方法之后需要執(zhí)行一次(方法必須是靜態(tài)的)
@AfterClass
public static void end() {
  System.out.println("在最后的時候執(zhí)行一次");
}


9.使用斷言做測試

測試的步驟

1.定義一個接口:IMath
2.定義一個IMath的實現(xiàn)類:MathImpl
3.完成測試代碼
4.完成實現(xiàn)類

使用 <u>斷言</u> 做測試

核心類:Assert

斷言需要:期望值凌停,真實值

在Eclipse中粱年,斷言成功,使用綠條表示罚拟,反之使用紅條台诗。

Assert.assertEquals(message, expected, actual);
// message : 斷言失敗的提示信息,成功不會提示
// expected : 期望值
// actual : 真實值 

10.XML

定義

XML赐俗,是一種可擴(kuò)展的標(biāo)記語言拉队。

在編寫XML文檔時,需要先使用文檔聲明來聲明xml文檔秃励。并且必須出現(xiàn)在文檔的第一行

<?xml version="1.0"?>

11.獲取Document對象

獲取Document對象的步驟:

// 1.確定文件的位置
File file = new File("文件的絕對路徑");
// 2.創(chuàng)建DocumentBuilderFactory工程類的對象(工廠類中往往體現(xiàn)著單例模式)
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
// 3.通過工廠類對象創(chuàng)建DocumentBuilder對象
DocumentBuilder builder = fac.newDocumentBuilder();
// 4.通過DocumentBuilder對象創(chuàng)建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節(jié)點
NodeList linkmanList = doc.getElementsByTagName("linkman");
// 使用循環(huán)遍歷linkmanList中的東西
for (int i = 0 ; i < linkmanList.getLength(); i++) {
  // 這里直接強轉(zhuǎn)成Element氏仗,因為上面使用的是getElements吉捶,實際上是要使用Element.getAttribute的方法
  Element ele = linkmanList.item(i);
  // 輸出第一個聯(lián)系人的id
  System.out.println("第一個聯(lián)系人的id-->" + ele.getAttribute("id"));
  // 繼續(xù)遍歷該聯(lián)系人下的name,email,address,group屬性
  // 使用getChildNodes()方法
  NodeList childNodes = item.getChildNodes();
  for (int j = 0; j < childNodes.getLength(); j++) {
    // 遍歷里面的Nodes
    Node node = childNodes.item(j);
    // 對每個Node的類型進(jìn)行判斷夺鲜,如果是ELEMENT_NODE(元素節(jié)點),就是我們要找的
    if (node.getNodeType == Node.ELEMENT_NODE) {
      // 強轉(zhuǎn)一下呐舔,因為要獲取到節(jié)點中的內(nèi)容
      Element ele = (Element) node;
      // 判斷這個節(jié)點名稱是什么name,email,address,group
      if (ele.getNodeName().equals("name")) {
        System.out.println("聯(lián)系人的姓名-->" + ele.getTextContent());
      } else if (ele.getNodeName.equals("email")) {
        System.out.println("聯(lián)系人的郵箱-->" + ele.getTextContent());
      }
      // ... 剩下的address,group就不在過多的演示了
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末币励,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子珊拼,更是在濱河造成了極大的恐慌食呻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仅胞,居然都是意外死亡每辟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門干旧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渠欺,“玉大人,你說我怎么就攤上這事椎眯∧咏” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵编整,是天一觀的道長舔稀。 經(jīng)常有香客問我,道長掌测,這世上最難降的妖魔是什么内贮? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮汞斧,結(jié)果婚禮上贺归,老公的妹妹穿的比我還像新娘。我一直安慰自己断箫,他們只是感情好拂酣,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仲义,像睡著了一般婶熬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埃撵,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天赵颅,我揣著相機與錄音,去河邊找鬼暂刘。 笑死饺谬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谣拣。 我是一名探鬼主播募寨,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼森缠!你這毒婦竟也來了拔鹰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贵涵,失蹤者是張志新(化名)和其女友劉穎列肢,沒想到半個月后恰画,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瓷马,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年拴还,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧聘。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡自沧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出树瞭,到底是詐尸還是另有隱情拇厢,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布晒喷,位于F島的核電站孝偎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凉敲。R本人自食惡果不足惜衣盾,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爷抓。 院中可真熱鬧势决,春花似錦、人聲如沸蓝撇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渤昌。三九已至虽抄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間独柑,已是汗流浹背迈窟。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忌栅,地道東北人车酣。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像索绪,于是被迫代替她去往敵國和親湖员。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理者春,服務(wù)發(fā)現(xiàn)破衔,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,149評論 0 2
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,129評論 15 116
  • 最近幾日天憋足了勁悶熱即使靜靜的呆著也會莫名出一身汗 終于下雨啦一場渴盼已久的及時雨驅(qū)散了平日的燥熱送來了酷暑的清...
    渺塵03閱讀 553評論 13 15