在jUnit單元測試中常用的註解有以下:
@BeforeClass 同時運行單元測試中的多個方法時,最先被執行,且只執行一次.
@Before 執行所有的@Test標註的方法之前都會被執行;
@Test 標註方法爲測試方法.
@After 執行所有的@Test標註的方法之後都會被執行; 同@Before
@AfterClass 同時運行單元測試中的多個方法時,最後被執行,且只執行一次. 同@BeforeClass
如果想打印當前正在測試的方法名稱,此時需要另一個註解@Rule,將它標註在TestName tm = new TestName()上
在我們測試一個類的多個方法時,爲了區分開來,正在測試的哪個方法,會把正在執行測試的方法名稱打印輸出.
現在有這樣一種場景,要測試一個List接口中的多個方法,同時要告訴用戶現在在測試哪個方法,有沒有結束等…
我們需要對集合進行初始化,如果每個測試方法中都對集合初始化,代碼重複部分較多,不便閱讀.
此時可以將初始化部分放到@BeforeClass標註的方法中,只執行一次;
所有的測試方法執行前都將方法名稱打印輸出,執行後都提示執行完成.
而所有的@Test標註的方法中只需要完成核心業務,代碼清晰易讀.
單元測試的代碼如下:
package test;
import java.util.ArrayList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
public class TestJavaSort {
static List<Integer> list = new ArrayList<Integer>();
//此處要求訪問級別爲public
//如果不寫訪問修飾符,運行後會報驗證錯誤(ValidationError) , The @Rule 'tm' must be public.
@Rule
public TestName tm = new TestName();
@BeforeClass
public static void init(){
System.out.println("init method(),這裏的代碼只執行一次");
list.add(10);
list.add(5);
list.add(9);
list.add(4);
list.add(5);
System.out.println(list);
}
@Before
public void before(){
System.out.println(tm.getMethodName() + " method start test...");
}
@Test
public void testAdd(){
list.add(15);
}
@Test
public void testRemove(){
list.remove(0);
}
@After
public void after(){
System.out.println(list);
System.out.println(tm.getMethodName() + "method test end!");
}
@AfterClass
public static void afterClass(){
System.out.println("所有的test方法已測試完成.");
}
}
單元測試運行結果如下:
init method(),這裏的代碼只執行一次
[10, 5, 9, 4, 5]
testAdd method start test...
[10, 5, 9, 4, 5, 15]
testAddmethod test end!
testRemove method start test...
[5, 9, 4, 5, 15]
testRemovemethod test end!
所有的test方法已測試完成. 這裏也只執行一次.
注:@BeforeClass和@AfterClass標註的方法必須是static類型的,即靜態方法.其它方法不做限制.
因爲每運行一個@Test方法,就會爲該測試類新建一個新的實例。而@BeforeClass是在實例創建之前,@AfterClass是在實例銷燬之後,因此在沒有實例還要執行的情況下,需要將方法改爲static類型.