注册扩展
了解如何在 JUnit 5 中注册扩展。
概述
在前面的章节中,我们已经了解了 JUnit 5 的扩展机制,包括参数解析器和参数化测试的参数源。这些都是 JUnit 5 内置的扩展。本章我们将学习如何创建自定义扩展。JUnit 5 提供了 org.junit.jupiter.api.extension.Extension 接口用于所有扩展。
Extension 只是一个标记接口。自定义扩展通常实现 Extension 的子接口。Extension 的实现类必须提供一个无参构造函数,以便 JUnit 平台能够创建新实例。所有扩展相关的接口都位于 org.junit.jupiter.api.extension 包中。
注册扩展
要使用一个扩展,首先需要将其注册到 JUnit 5。JUnit 5 的内置扩展会自动注册。自定义扩展可以通过 @ExtendWith 注解显式注册,也可以通过 Java 的服务提供者机制自动注册。
@ExtendWith 注解
@ExtendWith 注解可以添加到测试类或测试方法上,用于注册扩展。@ExtendWith 的唯一值是 Class<? extends Extension> 类型的数组。该注解是可重复的,因此可以在同一个类或方法上添加多个 @ExtendWith 注解,以注册多个扩展。
Java 服务提供者机制
扩展也可以通过 Java 的服务提供者机制(java.util.ServiceLoader)进行注册,这种方式特别适合第三方扩展。将这些扩展放入类路径后,可以自动完成注册。扩展类需满足服务提供者的标准要求:JAR 文件的 /META-INF/services 目录下应包含名为 org.junit.jupiter.api.extension.Extension 的文件,其内容为扩展类的全限定名。
使用 `ServiceLoader` 注册扩展默认是禁用的。需要通过设置 JVM 系统属性 `junit.jupiter.extensions.autodetection.enabled` 为 `true` 来启用,方法是在 JVM 启动参数中添加 `junit.jupiter.extensions.autodetection.enabled=true`。
