在 JUnit 4 中加入了两个注解:@BeforeClass 和@AfterClass,使用这两个注解的方法,在一个Test 类的所有测试方法执行前后各执行一次。这是为了能在@BeforeClass 中初始化一些昂贵的资源,例如数据库连接,然后执行所有的测试方法,最后在@AfterClass 中释放资源。
@BeforeClass \ @AfterClass | @Before \ @After |
在一个类中只可以出现一次 | 在一个类中可以出现多次,执行顺序@Before是从下往上执行,@After是从上往下执行(可以写个Test类测试下) |
方法名不做限制 | 方法名不做限制 |
在类中只运行一次 | 在每个测试方法之前或者之后都会运行一次 |
@BeforeClass 父类中标识了该注解的方法将会先于当前类 中标识了该注解的方法执行。 @AfterClass 父类中标识了该注解的方法将会在当前类中 标识了该注解的方法之后执行 | @Before 父类中标识了该注解的方法将会先于当前类中 标识了该注解的方法执行。 @After 父类中标识了该注解的方法将会在当前类中标 识了该注解的方法之后执行 |
必须声明为public static void | 必须声明为public 并且非static void |
所有标识为@AfterClass 的方法都一定会被执行,即使在标 识为@BeforeClass 的方法抛出异常的的情况下也一样会 | 所有标识为@After 的方法都一定会被执行,即使在标识为 @Before 或者 @Test 的方法抛出异常的的情况下也一样会 |
JUnit4使用Java5中的注解(annotation),以下是JUnit4常用的另外几个annotation:
@Test:测试方法,在这里可以测试期望异常和超时时间
@Test(expected=ArithmeticException.class)检查被测方法是否抛出ArithmeticException异常
@Ignore:忽略的测试方法
一个JUnit4的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一个测试方法的调用顺序为:
@Before -> @Test ->@After;
以下是测试执行顺序代码:
[java]
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@BeforeClass
public static void beforeClass1(){
System.out.println("@beforeClass1");
}
@BeforeClass
public static void beforeClass2(){
System.out.println("@beforeClass2");
}
@Before
public void before1() throws Exception {
System.out.println("@before1");
}
@Before
public void before2() throws Exception {
System.out.println("@before2");
}
@Test
public void testAdd() {
System.out.println(1);
}
@Test
public void testSubstract() {
System.out.println(2);
}
@Ignore("Multiply() Not yet implemented")
@Test
public void testMultiply() {
System.out.println(3);
fail("Not yet implemented");
}
@Test
public void testDivide() {
System.out.println(4);
}
@Test(timeout = 1000)
public void testSquareRoot() {
System.out.println(5);
}
@Test
//@Test(expected = ArithmeticException.class)
public void divideByZero() {
System.out.println(6);
}
@After
public void after1(){
System.out.println("@after1");
}
@After
public void after2(){
System.out.println("@after2");
}
@AfterClass
public static void afterClass1(){
System.out.println("@afterClass1");
}
@AfterClass
public static void afterClass2(){
System.out.println("@afterClass2");
}
}
执行结果: @beforeClass2
@beforeClass1
@before2
@before1
1
@after1
@after2
@before2
@before1
2
@after1
@after2
@before2
@before1
4
@after1
@after2
@before2
@before1
5
@after1
@after2
@before2
@before1
6
@after1
@after2
@afterClass1
@afterClass2