我們平時編寫自己的測試類,如果沒有斷言,那么就沒寫測試的必要了。
JUnit框架用一組assert方法封裝了最常見的測試任務。這些assert方法可以極大地簡化單元測試的編寫。
Assert類包含了一組靜態的測試方法,用於驗證期望值expected和實際值actual邏輯比對是否正確,即測試失敗,標志為未通過測試。
如果期望值和實際值比對失敗,Assert類就會拋出一個AssertionFailedError異常,Junit測試框架將這種錯誤歸入Fails並且加以記錄。
每一個Assert類所屬的方法都會被重載(OverLoaded),如果指定了一個String類型的傳參則該參數將被做為AssertionFailedError異常的標識信息,告訴測試人員該異常的具體信息。
定義assert方法的輔助類的名稱:Assert類。這個類包含了很多對於編寫測試很有用的具體代碼。Assert只有8個公有核心公有核心方法(如下圖所示)。
Javadoc 中充滿了這8個方法的便捷形式。這些便捷形式使得傳遞在測試中需要的任何類型都很簡單。以assertEquals方法為例,它就有20種形式!大多數形式都是便捷形式,最終還是調用了核心的assertEquals(String message,Object expected, Object actual)方法。其實我一直比較好奇的,為什么Assert類沒有assertNotEquals方法。另外在junit4中,也加入了AssertArrayEquals方法和AssertThat方法,這2個方法一個用來比較數組,一個用來使用matcher做自定義校驗,關於Hamcrest我后面會專門做整理,這里先不做贅述。
總結:
1,關於上面的幾個方法,我們都可以在使用它的重載方法,在第一個位置多帶一個參數,如果斷言不通過,拋出的異常信息中就會封裝着我們傳入的第一個異常參數信息。
2,在使用AssertEquals方法的時候,如果比較的2個參數是double或者float類型的時候,在第3個參數我們還可以傳入一個誤差范圍。如果實際值在(期望值-誤差范圍)和(期望值+誤差范圍)內,那么測試通過。
當進行帶有輸入誤差和截斷誤差的數學運算時,或者當斷言一個關於文件修改日期的條件時,這些重載方法就很有用。
3,我們在使用上面的這些斷言的時候,可以靜態一次導入Assert類。
import static org.junit.Assert.*;4,使用3.8系列的junit的話不用import這個斷言類,使用4以后的系列必須inport進來,因為4X版本的junit又重新寫了斷言類,看過源碼就知道是有2個斷言類的。38那個斷言類過時了,所以我們使用org.junit下面那個斷言類。
package junit.framework; /** * A set of assert methods. Messages are only displayed when an assert fails. * * @deprecated Please use {@link org.junit.Assert} instead. */ @Deprecated public class Assert {}
package org.junit; import org.hamcrest.Matcher; import org.hamcrest.MatcherAssert; import org.junit.internal.ArrayComparisonFailure; import org.junit.internal.ExactComparisonCriteria; import org.junit.internal.InexactComparisonCriteria; /** * A set of assertion methods useful for writing tests. Only failed assertions * are recorded. These methods can be used directly: * <code>Assert.assertEquals(...)</code>, however, they read better if they * are referenced through static import: * * <pre> * import static org.junit.Assert.*; * ... * assertEquals(...); * </pre> * * @see AssertionError * @since 4.0 */ public class Assert {}