今天開始學java(十八)Junit單元測試、反射與註解(好日子來臨罷!)

Junit單元測試:
測試分類:
1、黑盒測試:不需要寫代碼,給輸入值,看程序是否能輸出期望值
2、白盒測試:需要寫代碼,關注程序具體執行流程。

Junit使用:白盒測試使用
	步驟:
	1、定義一個測試類(測試用例)
		建議:
			測試類名:被測試的類名後加上Test 
			包名:xxx.xxx.xx.test
			
	2、定義測試方法:可以獨立運行
		建議:
			方法名:test測試的方法名	例子`testadd()`
			返回值:void,沒有返回值,因爲結果自己看就好了,沒必要寫返回值所以寫void
			參數列表:空參
			
	3、給方法加註解@Test
		加上@Test方法即可獨立運行
		
	4、導入Junit依賴包
	
判定結果:
紅色失敗,綠色成功
	一般使用斷言操作來處理結果
	例子:`Assert.assertEquals(期望的結果,運算的結果);` 
	
補充:
@Before:修飾的方法會在測試方法之前被自動執行,一般用於資源的申請
@After:修飾的方法會在測試方法執行之後自動被執行,一般用於資源的釋放
    @Before
    public void init(){
        System.out.println("init...");
    }
    
    @After
    public void close(){
        System.out.println("close。。。(`ヮ´ )");
    }

    @Test
    public void testAdd(){
        jisuanqi c = new jisuanqi();
        int result = c.add(1, 2);
        System.out.println("testAdd...");
        Assert.assertEquals(4,result);
    }

輸出的結果爲:

init...
testadd
close。。。(`ヮ´ )

反射

框架設計的靈魂,反射就是將一個類的組成部門封裝成爲其他對象,獲取和操作這些項時,最關鍵的是要獲取class類對象
框架:半成品軟件。可以在框架的基礎上進行軟件的開發,簡化編碼
	反射機制:將類的各個組成部分封裝爲其他對象
		好處:1、在程序運行過程中,操作這些對象。
			  2、可以解耦,降低程序的耦合性,來提高程序的可擴展性

獲取class對象的方式:
1、class.forName("全類名"):將字節碼文件加載進內存,返回class對象
	*多用於配置文件,將類名定義在配置文件中,讀取文件,加載類 
2、類名.class:通過類名的屬性class來獲取
	*多用於參數的傳遞
3、對象.getClass():getClass()在object類中定義着
	*多用於對象的獲取字節碼的方式
	
同一個字節碼文件(*.class)在一次運行過程中,只會被加載一次,無論通過哪一種方式獲取的class對象都是同一個

Class對象功能:
	*獲取功能:
		1、獲取成員變量們
		`getFields()`
		2、獲取構造方法們
		3、獲取成員方法們
		4、獲取類名稱
		獲取。。

	反射技術的案例:
	需求:寫一個“框架”,不改變該類的任何代碼的前提下,可以幫我們創建任意類的對象,並且執行其中任意方法。
	步驟:1、將需要創建的對象的全類名和需要執行的方法定義在配置文件中
		  2、在程序中加載讀取配置文件
		  3、使用反射技術來加載類文件進內存
		  4、創建對象
		  5、執行方法

註解:說明程序,給計算機看的

JDK中預定義的一些內置註解
@Override :檢測被該註解標註的方法是否是繼承自父類的
@Oeprecated :將該註解標註的內容,表示已過時
@SuppressWarning :壓制警告,一般寫在類的開頭,傳入的參數可以消除類中的警告,例如:@SuppressWarning(“all”)

自定義註解

格式:
	元註解
	public @interface 註解名稱{}
本質:註解本質就是一個藉口,該接口默認繼承Annotation接口
屬性:接口中可以定義的成員方法(抽象方法)
	要求:屬性的返回值類型
		*基本數據類型 public abstract int show1();
		*String		String show2();//可以省略public abstract
		*枚舉		創建一個枚舉類,public enum Person{p1,p2;} Person per;
		*註解
		*以上類型的數組
	如果自定義的註解需要賦值,則需要在使用註解時賦值,如使用默認值,需要在定義時後面加default,例如`String name() default "bate";`
	
	如果只有一個屬性需要賦值,並且屬性的名稱叫value,可以在使用註解時直接定義值。

元註解

用於描述註解的註解就是元註解哈哈哈哈哈哈
@Target:描述註解能夠作用的位置,如果想及作用與方法、類、成員變量上的話需要在加@Target標籤時value中添加對應的取值範圍`@Target({ElementType.TYPE})`
	ElementType取值:
		TYPE:可以用作於類上
		METHOD:可以用作於方法上
		FIELE:可以用作於成員變量上
@Retention:描述註解被保留的階段
@Documented:描述註解是否被抽取到api文檔中
@Inherited:描述註解是否被子類繼承

解析註解:獲取註解中定義的屬性值

1、獲取註解定義的位置的對象(Class,Method,Field)
2、獲取指定的註解
3、調用註解的抽象方法獲取配置的屬性值

總結:
1、大多數時候我們會使用註解,而不是自定義註解
2、註解一般只在編譯器和解析程序使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章