通常在执行测试用例之前,需要做一些设置,或者MOCK一些数据。可以在每个测试用例中都写一段这样的逻辑,但是更好的一种做法是覆写TestCase的setup和teardown方法。如下:
public class JUnitTestCaseWOAnnotation extends TestCase {
private AccountService accountService = new AccountService();
private Account dummyAccount;
//覆写该方法,做些准备工作
@Override
protected void setUp() throws Exception {
System.out.println("Setting it up!");
dummyAccount = accountService.getAccountDetails();
}
public void testDummyAccount() {
System.out.println("Running: testDummyAccount");
assertNotNull(dummyAccount.getAccountCode());
}
public void testDummyAccountTransactions() {
System.out.println("Running: testDummyAccountTransactions");
assertEquals(dummyAccount.getAccountTransactions().size(),3);
}
//覆写该方法,做些必要的清理工作
@Override
protected void tearDown() throws Exception {
System.out.println("Running: tearDown");
dummyAccount = null;
assertNull(dummyAccount);
}
}
另一种更推荐的做法是使用注解@Before和@After。
public class JUnitTestCaseWAnnotation {
private AccountService accountService = new AccountService();
private Account dummyAccount;
// setup()
@Before
public void before() throws Exception {
System.out.println("Setting it up!");
dummyAccount = accountService.getAccountDetails();
}
@Test
public void testDummyAccount() {
System.out.println("Running: testDummyAccount");
assertNotNull(dummyAccount.getAccountCode());
}
@Test
public void testDummyAccountTransactions() {
System.out.println("Running: testDummyAccountTransactions");
assertEquals(dummyAccount.getAccountTransactions().size(),3);
}
// tearDown()
@After
public void after() throws Exception {
System.out.println("Running: tearDown");
dummyAccount = null;
assertNull(dummyAccount);
}
}
类似的注解还有@BeforeClass和@AfterClass。比较如下:
@BeforeClass会在所有测试用例执行之前执行。且只会执行一次;
而@Before会在每个测试用例执行之前都执行一次。
@AfterClass 与 @After 的比较类似。
此外,
-
@BeforeClass与@AfterClass只能注释static方法。 - 无论
@BeforeClass,@Before是否执行成功,或有异常抛出,@AfterClass与@After都会执行。
引用
JUnit SetUp / TearDown Example
Difference between @Before and @BeforeClass.