我們平時編寫自己的測試類,如果沒有斷言,那么就沒寫測試的必要了。
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 {}
