JUNIT4.11原始碼閱讀(一)--org.junit.Assert類
最近開始閱讀JUNIT4.11原始碼,特寫此文記錄,如有不妥之處煩請指正!
1 原始碼匯入:junit4.11.zip
將檔案解壓,然後獲得5個JAR包,解壓junit-4.11-sources.jar 這裡就是我們最好需要的原始碼
將程式碼匯入eclipse,OK。
2 建立一個Junit Test Case,系統自動引入了兩個類,我們就先從這兩個類開始看
3 org.junit.Assert類閱讀
Assert類是JUNIT從4.0版本進行新增的
它是一組編寫測試用例時使用的斷言(斷言用於在程式碼中捕捉這些假設,可以將斷言看作是異常處理的一種高階形式),失敗的斷言將會被記錄。Assert裡面所有的方法都是static的,這些方法都可以直接使用,匯入:import static org.junit.Assert.*; 類方法就可以直接使用了。
- static public void fail(String ):所有呼叫過這個方法都表示測試用例執行失敗,丟擲java.lang.AssertionError錯誤,該類是為了表明斷言是失敗
- static public void fail():呼叫 fail(null)
- static public void assertTrue(String , boolean ):正案例呼叫,在傳入的boolean為true時用例執行通過
- static public void assertFalse(String , boolean ):反案例呼叫,在傳入的boolean為false時用例執行通過
- static public void assertEquals(String, Object, Object ):進入後呼叫equalsRegardingNull()方法後,返回true後用例執行成功,在else if中判斷兩個引數instanceof string的話,丟擲ComparisonFailure(繼承AssertionError),equalsRegardingNull()返回false後,用例執行失敗,呼叫failNotEquals(String, Object, Object)
- private static boolean equalsRegardingNull(Object, Object):當兩個值都為null的時候返回true,否則呼叫isEquals(Object,Object)
- private static boolean isEquals(Object, Object):呼叫Object的equals(),私有方法,封裝具體實現
- static public void assertNotEquals(String, Object, Object ):在equalsRegardingNull(first, second)返回true時不通過
- private static void failEquals(String, Object) :呼叫fail(),調整傳入格式為:“Values should be different.”+String+Object
- static public void assertNotEquals(String, long, long):做一個強制性型別轉換
- static public void assertNotEquals(String, double 1,double 2, double delta) :在delta範圍內,兩個double或者floats也被認為是相等的,當1無窮大時,誤差值會被忽略。內部呼叫doubleIsDifferent(first, second, delta)
- static private boolean doubleIsDifferent(double d1, double d2, double delta):判斷兩個數值是否相等或誤差在規定範圍內,呼叫Double.compare和Math.abs,當兩個數值滿足條件時,返回false
- public static void assertArrayEquals(String, Object[] ,Object[] ) throws ArrayComparisonFailure:內部呼叫internalArrayEquals,
- private static void internalArrayEquals(String, Object ,Object ) throws ArrayComparisonFailure:通過類ExactComparisonCriteria呼叫了Assert.assertEquals,所有本質上還是參考上面的方法(這個類繼承了ComparisonCriteria,在這個裡面單獨也實現了一次assertEquals),這裡沒太看懂,為什麼這裡要做一個私有方法和公共類進行一次封裝啊?是什麼設計模式嗎?
- static public void assertEquals(String, double, double , double ):在範圍內判斷double是否相等,呼叫doubleIsDifferent。同時提供:float的判斷,通過Float和Math.abs判斷。提供:long,double(被 @Deprecated註釋,推薦使用assertEquals(double, double , double )),float
- static public void assertNotNull(String, Object ):判斷Object是否為空,實現為:assertTrue(message, object != null);不為空時用例執行通過
- static public void assertNull(String , Object ):Object為空時用例執行成功
- static private void failNotNull(String , Object ):修改輸出格式,fail(formatted + “expected null, but was:<” + actual + “>”);更準確的描述錯誤資訊
- static public void assertSame(String , Object , Object ):直接判斷(expected == actual),在不相等時呼叫下面的函式,判斷兩個物件是否指向相同的Object ,不相同時用例執行失敗。
- static private void failNotSame(String , Object ,Object ):修改輸出格式,formatted + “expected same:<” + expected + “> was not:<” + actual + “>”;更準確的描述錯誤資訊
- static public void assertNotSame(String , Object ,Object ):相同時用例執行失敗。
- static private void failSame(String ):fail(formatted + “expected not same”);
- static String format(String, Object, Object):格式化錯誤輸出
- private static String formatClassAndValue(Object , String ):className + “<” + valueString + “>”,將傳入的資訊進行格式化,在上一個函式中進行呼叫
- public static void assertThat(T actual, Matcher