清單 24 中給出了使用測(cè)試執(zhí)行中的回調(diào)方法的示例。
清單 24. 使用測(cè)試執(zhí)行回調(diào)方法的示例
public class Timing implements BeforeTestExecutionCallback,
AfterTestExecutionCallback {
@Override
public void beforeTestExecution
(final TestExtensionContext context) throws Exception {
getStore(context).put
(context.getTestMethod().get(), System.currentTimeMillis());
}
@Override
public void afterTestExecution
(final TestExtensionContext context) throws Exception {
final Method testMethod = context.getTestMethod().get();
final long start = getStore(context).remove(testMethod, long.class);
final long duration = System.currentTimeMillis() - start;
context.publishReportEntry(ImmutableMap.of
(testMethod.getName(), Long.toString(duration)));
}
private Store getStore(TestExtensionContext context) {
return context.getStore(Namespace.create(getClass(), context));
}
}
異常處理
通過 TestExecutionExceptionHandler 接口可以對(duì)測(cè)試運(yùn)行中拋出的異常進(jìn)行處理?梢栽谶\(yùn)行中忽略某些異常,或是在特定類型的異常發(fā)生時(shí)執(zhí)行某些處理動(dòng)作,如可以在出現(xiàn)數(shù)據(jù)庫異常時(shí)回滾事務(wù)。清單 25 給出了異常處理的示例。
清單 25. 異常處理的示例
public class IgnoreNullPointerException implements
TestExecutionExceptionHandler {
@Override
public void handleTestExecutionException
(final TestExtensionContext context,
final Throwable throwable) throws Throwable {
if (throwable instanceof NullPointerException) {
return;
}
throw throwable;
}
}
遷移指南
JUnit 平臺(tái)可以通過 Jupiter 引擎來運(yùn)行 JUnit 5 測(cè)試,Vintage 引擎來運(yùn)行 JUnit 3 和 JUnit 4 測(cè)試。因此,已有的 JUnit 3 和 4 的測(cè)試不需要任何修改可以直接在 JUnit 平臺(tái)上運(yùn)行。只需要確保 Vintage 引擎的 jar 包出現(xiàn)在 classpath 中,JUnit 平臺(tái)會(huì)自動(dòng)發(fā)現(xiàn)并使用該引擎來運(yùn)行 JUnit 3 和 4 測(cè)試。開發(fā)人員可以按照自己的項(xiàng)目安排來規(guī)劃遷移到 JUnit 5 的進(jìn)度?梢员3忠延械 JUnit 3 和 4 的測(cè)試用例不變,而新增加的測(cè)試用例則使用 JUnit 5。
在進(jìn)行遷移的時(shí)候需要注意如下的變化:
注解在 org.junit.jupiter.api 包中,斷言在 org.junit.jupiter.api.Assertions 類中,前置條件在 org.junit.jupiter.api.Assumptions 類中。
把@Before 和@After 替換成@BeforeEach 和@AfterEach。
把@BeforeClass 和@AfterClass 替換成@BeforeAll 和@AfterAll。
把@Ignore 替換成@Disabled。
把@Category 替換成@Tag。
把@RunWith、@Rule 和@ClassRule 替換成@ExtendWith。
小結(jié)
單元測(cè)試是應(yīng)用程序不可或缺的一部分。作為 Java 開發(fā)中單元測(cè)試的事實(shí)標(biāo)準(zhǔn),JUnit 被廣泛使用。本文詳細(xì)介紹了在 JUnit 5 中編寫和運(yùn)行測(cè)試用例的方式,并對(duì)新的擴(kuò)展機(jī)制做了詳細(xì)介紹。在編寫測(cè)試用例方面,本文介紹了 JUnit 5 中新的注解、斷言和前置條件,以及對(duì)于嵌套測(cè)試、依賴注入和動(dòng)態(tài)測(cè)試的支持。在運(yùn)行測(cè)試用例方面,詳細(xì)介紹了通過 Gradle、Maven 和命令行來運(yùn)行 JUnit 5 測(cè)試。擴(kuò)展機(jī)制作為 JUnit 5 的一大亮點(diǎn),本文詳細(xì)介紹了如何通過擴(kuò)展來添加測(cè)試執(zhí)行條件、后處理測(cè)試實(shí)例、解析測(cè)試和處理異常等。開發(fā)人員可以現(xiàn)在嘗試 JUnit 5 中的新功能。