文章目錄
- 一:Junit單元測試
- 測試分類:
- Junit的使用
- @Before_@After
- 二:注解
- 什么是注解
- 文檔相關的注解
- IDEA中的javadoc使用:
- JDK內置的3個注解
- 自定義注解
- 元注解
- @Retention
- @Target
- @Repeatable
- @Documented(用的很少)
- @Inherited(用的極少)
- 三:枚舉
- enum關鍵字定義枚舉類
- Enum;類的常用方法
- 枚舉類實現接口
- 枚舉的應用
一:Junit單元測試
測試分類:
(1)黑盒測試:
軟件的黑盒測試意味著測試要在軟件的接口處進行。這種方法是把測試對象看做一個黑盒子,測試人員完全不考慮程序內部的邏輯結構和內部特性,只依據程序的需求規格說明書,檢查程序的功能是否符合它的功能說明。因此黑盒測試又叫功能測試。
(2)白盒測試:—》Junit屬于白盒測試。
軟件的白盒測試是對軟件的過程性細節做細致的檢查。這種方法是把測試對象看做一個打開的盒子,它允許測試人員利用程序內部的邏輯結構及有關信息,設計或選擇測試用例,對程序的所有邏輯路徑進行測試,通過在不同點檢查程序狀態,確定實際狀態是否與預期的狀態一致。因此白盒測試又稱為結構測試。
Junit的使用
1.一般測試和業務做一個分離,分離為不同的包
2.測試類的名字:****Test —>見名知意
3.測試方法的定義–》這個方法可以獨立運行,不依托于main方法
4.測試方法定義完以后,不能直接就獨立運行了,必須要在方法前加入一個注解: @Test
5.導入Junit的依賴的環境
代碼可能程序上沒異常但邏輯上有問題,判定結果依舊為綠色但不代表測試通過所以我們要加入斷言: Assert.assertEquals()
第一個參數預測結果,第二個參數實際結果
測試類代碼
public class Calclatortest {Calculator cal=new Calculator();@Testpublic void Testadd(){int result=cal.add(1,4);//加入斷言:預測一下結果,判斷一下我預測的結果和 實際的結果是否一致:Assert.assertEquals(5,result);}@Testpublic void Testsub(){int ans=cal.sub(5,1);Assert.assertEquals(4,ans);}
}
@Before_@After
@Before:
某一個方法中,加入了@Before注解以后,那么這個方法中的功能會在測試方法執行前先執行
一般會在@Beforer修飾的那個方法中加入一些申請資源的代碼:申請數據庫資源,申請IO資源,申請網絡資源
@After:
某一個方法中,加入了@After注解以后,那么這個方法中的功能會在測試方法執行后先執行
一般會在@After修飾的那個方法中加入釋放資源的代碼:釋放數據庫資源,釋放IO資源,釋放網絡資源
用法
@Beforepublic void init(){System.out.println("開始測試");}@Afterpublic void close(){System.out.println("結束測試");}
二:注解
什么是注解
1.在編譯,類加載,運行時被讀取,并執行相應的處理。通過使用注解,程序員可以在不改變原有邏輯的情況下,在源文件中嵌入一些補充信息。
2.一定程度上可以說 :框架=注解+反射+設計模式
文檔相關的注解
@param @return和@exception這三個標記都是只用于方法的。
@param的格式要求: @param 形參名 形參類型 形參說明
@return的格式要求: @return 返回值類型返回值說明,如果方法的返回值類型是void就不能寫
@exception的格式要求: @exception 異常類型異常說明
@param和@exception可以并列多個
IDEA中的javadoc使用:
在畫圈處輸入上述文字可以防止亂碼
JDK內置的3個注解
1.@Override:限定重寫父類方法,該注解只能用于方法
作用:限定重寫的方法,只要重寫方法有問題,就有錯誤提示。
2.@Deprecated:用于表示所修飾的元素(類,方法,構造器,屬性等)已過時。通常是因為所修飾的結構危險或存在更好的選擇
在方法前加入@Deprecated,這個方法就會變成一個過時方法
3.@SuppressWarnings:抑制編譯器警告
作用:若編譯器警告這一代碼,可以加入@SuppressWarnings使其不觸發警告
自定義注解
1.創建java注解
@interface,跟接口沒有一點關系
2.注解的內部: 以@SuppressWarnings為例,發現內部:
實際上:
value()是屬性,不是方法
String[]是無參數方法(成員變量)的類型
無參數方法的類型:基本數據類型(八種),String,枚舉,注解類型,還可以是以上類型對應的數組
參數叫做:配置參數
3.使用注解
如果定義了配置參數那么使用時必須給配置參數賦值
如果在定義配置參數時已經給其賦值了那么使用的時候無需傳值
賦值操作:
內部沒有定義配置參數的注解可以叫做標記
內部定義了配置參數的注解叫做元數據
元注解
元注解是用于修飾其它注解的注解
@Retention
作用:指定 修飾的那個注解的生命周期
@Rentention包含一個RetentionPolicy枚舉類型的成員變量,使用@Rentention時必須為該value成員變量指定值:
(1)RetentionPolicy.SOURCE:在源文件中有效
(2)RetentionPolicy.CLASS:在class文件中有效,保留在.class文件中,但是當運行Java程序時,他就不會繼續加載了,不會保留在內存中,JVM不會保留注解
(3)RetentionPolicy.CLASS:在class文件中有效(即class保留),保留在.class文件中,但是當運行Java程序時,他就不會繼續加載了,不會保留在內存中,JVM不會保留注解
如果注解沒有加Retention元注解,那么相當于默認的注解是.CLASS的狀態
@Target
作用:被修飾的注解能用于修飾哪些程序元素
@Target也包含一個名為value的成員變量
給配置參數賦值:
1.TYPE,代表可以修飾類
2.METHOD,代表可以修飾方法
3.更多的可以去@Target的源碼里面找
annotation
@Target({TYPE, METHOD})
public @interface annotation {
}
我們給配置參數復制了TYPE和METHOD使annotation注解只可以修飾類和方法,但屬性和構造器不可修飾
注意: 記得導包
@Repeatable
作用:被該元注解修飾的注解 可以重復的修飾同一個位置
@Documented(用的很少)
作用:被該元注解修飾的注解類將被javadoc工具提取成文檔。默認情況下,javadoc不包括注解
@Inherited(用的極少)
作用:如果某個類使用了被 @Inherited修飾的注解,則其子類將自動具有該注解
三:枚舉
enum關鍵字定義枚舉類
public enum Season {//必須將對象放在最開始的位置SPRING("春天","春暖花開"),SUMMER("夏天","烈日炎炎"),AUTUMN("秋天","碩果累累"),WINTER("冬天","冰天雪地");private final String SeasonName;//季節名稱private final String SeasonDesc;//季節描述//構造器私有化,外界不能調用這個構造器,只能Season內部自己調用private Season(String SeasonName,String SeasonDesc){this.SeasonName=SeasonName;this.SeasonDesc=SeasonDesc;}public String getSeasonDesc() {return SeasonDesc;}public String getSeasonName() {return SeasonName;}@Overridepublic String toString() {return "Season{" +"SeasonName='" + SeasonName + '\'' +", SeasonDesc='" + SeasonDesc + '\'' +'}';}
}
測試類
public class Test1 {public static void main(String[] args) {Season winter = Season.WINTER;System.out.println(winter);}
}
SPRING(“春天”,“春暖花開”),
SUMMER(“夏天”,“烈日炎炎”),
AUTUMN(“秋天”,“碩果累累”),
WINTER(“冬天”,“冰天雪地”);
這樣寫省略了public static final Season SPRING = new Season(“春天”,“春暖花開”);
我們可以看到 Season類中重寫了toString方法所以我們輸出的結果是
現在我們將Season類中的同String方法去掉
依舊運行Test類輸出的結果是
因為enum的上層父類不是Object而是java.lang.Enum
Enum;類的常用方法
1.toString():獲取對象的名字
2.values: 返回枚舉類對象的數組
3.valueOf:通過對象名字獲取這個枚舉對象
枚舉類實現接口
接口
public interface ii {void show();
}
Season類
public enum Season implements ii{SPRING,SUMMER,AUTUMN,WINTER;@Overridepublic void show() {System.out.println("這是春天");}
}
Test類
public class Test {public static void main(String[] args) {Season spring = Season.SPRING;spring.show();Season winter = Season.WINTER;winter.show();}
}
輸出結果:
我們發現上面 所有的枚舉對象,調用這個show方法的時候走的都是同一個方法,結果都一樣
我們想要不同的對象調用的show方法不同
改進后的Season類
public enum Season implements ii{SPRING{public void show() {System.out.println("這是春天");}},SUMMER {public void show() {System.out.println("這是夏天");}},AUTUMN {public void show() {System.out.println("這是春秋天");}},WINTER {public void show() {System.out.println("這是冬天");}};
}
這樣子就可以達到我們的目的
枚舉的應用
1.可以在入口處對參數進行限制
例如:性別只有“男”和“女”種,所以我們可以使用enum來對設置性別的參數進行限制
Person類
public class Person {private Gender sex;public Gender getSex() {return sex;}public void setSex(Gender sex) {this.sex = sex;}
}
Gender類
public enum Gender {男,女;
}
Test類
我們發現只要set方法傳入的不是“男”或”女“就會報錯