清单 24 中给出了使用测试执行中的回调方法的示例。
清单 24. 使用测试执行回调方法的示例
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 接口可以对测试运行中抛出的异常进行处理。可以在运行中忽略某些异常,或是在特定类型的异常发生时执行某些处理动作,如可以在出现数据库异常时回滚事务。清单 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 包出现在 classpath 中,JUnit 平台会自动发现并使用该引擎来运行 JUnit 3 和 4 测试。开发人员可以按照自己的项目安排来规划迁移到 JUnit 5 的进度。可以保持已有的 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 开发中单元测试的事实标准,JUnit 被广泛使用。本文详细介绍了在 JUnit 5 中编写和运行测试用例的方式,并对新的扩展机制做了详细介绍。在编写测试用例方面,本文介绍了 JUnit 5 中新的注解、断言和前置条件,以及对于嵌套测试、依赖注入和动态测试的支持。在运行测试用例方面,详细介绍了通过 Gradle、Maven 和命令行来运行 JUnit 5 测试。扩展机制作为 JUnit 5 的一大亮点,本文详细介绍了如何通过扩展来添加测试执行条件、后处理测试实例、解析测试和处理异常等。开发人员可以现在尝试 JUnit 5 中的新功能。