清單 24 中給出了使用測試執(zhí)行中的回調方法的示例。
清單 24. 使用測試執(zhí)行回調方法的示例
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 接口可以對測試運行中拋出的異常進行處理?梢栽谶\行中忽略某些異常,或是在特定類型的異常發(fā)生時執(zhí)行某些處理動作,如可以在出現(xiàn)數(shù)據(jù)庫異常時回滾事務。清單 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 平臺可以通過 Jupiter 引擎來運行 JUnit 5 測試,Vintage 引擎來運行 JUnit 3 和 JUnit 4 測試。因此,已有的 JUnit 3 和 4 的測試不需要任何修改可以直接在 JUnit 平臺上運行。只需要確保 Vintage 引擎的 jar 包出現(xiàn)在 classpath 中,JUnit 平臺會自動發(fā)現(xiàn)并使用該引擎來運行 JUnit 3 和 4 測試。開發(fā)人員可以按照自己的項目安排來規(guī)劃遷移到 JUnit 5 的進度?梢员3忠延械 JUnit 3 和 4 的測試用例不變,而新增加的測試用例則使用 JUnit 5。
在進行遷移的時候需要注意如下的變化:
注解在 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。
小結
單元測試是應用程序不可或缺的一部分。作為 Java 開發(fā)中單元測試的事實標準,JUnit 被廣泛使用。本文詳細介紹了在 JUnit 5 中編寫和運行測試用例的方式,并對新的擴展機制做了詳細介紹。在編寫測試用例方面,本文介紹了 JUnit 5 中新的注解、斷言和前置條件,以及對于嵌套測試、依賴注入和動態(tài)測試的支持。在運行測試用例方面,詳細介紹了通過 Gradle、Maven 和命令行來運行 JUnit 5 測試。擴展機制作為 JUnit 5 的一大亮點,本文詳細介紹了如何通過擴展來添加測試執(zhí)行條件、后處理測試實例、解析測試和處理異常等。開發(fā)人員可以現(xiàn)在嘗試 JUnit 5 中的新功能。