如何在JUnit 5的ExecutionCondition中访问自定义注解的属性值?
解决JUnit 5 ExecutionCondition中访问自定义注解属性的问题
不用纠结testDescriptor字段,JUnit 5的ExtensionContext提供了更直接的方式获取自定义注解的属性值,核心是通过getElement()方法拿到被注解的类或方法元素,进而读取注解配置。
步骤1:实现ExecutionCondition时获取注解实例
在你的DisableOnServerNotListening扩展类中,通过extensionContext.getElement()获取被注解的元素,再提取@DisabledOnServerNotListening注解的属性:
import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; import org.junit.jupiter.api.extension.ExtensionContext; import java.net.Socket; import java.util.Optional; public class DisableOnServerNotListening implements ExecutionCondition { @Override public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext extensionContext) { // 获取自定义注解实例 Optional<DisabledOnServerNotListening> annotationOpt = extensionContext.getElement() .map(element -> element.getAnnotation(DisabledOnServerNotListening.class)); if (annotationOpt.isEmpty()) { return ConditionEvaluationResult.enabled("未标记@DisabledOnServerNotListening注解"); } DisabledOnServerNotListening annotation = annotationOpt.get(); // 读取注解指定的属性名 String hostPropKey = annotation.propertyNameHost(); String portPropKey = annotation.propertyNamePort(); // 步骤2:从配置中读取主机和端口 // 这里用JUnit 5内置的配置参数读取,若为Spring环境可替换为Environment String host = extensionContext.getConfigurationParameter(hostPropKey) .orElseThrow(() -> new IllegalArgumentException("配置项不存在: " + hostPropKey)); int port = Integer.parseInt(extensionContext.getConfigurationParameter(portPropKey) .orElseThrow(() -> new IllegalArgumentException("配置项不存在: " + portPropKey))); // 步骤3:检测端口监听状态 boolean serverAlive = isPortOpen(host, port); return serverAlive ? ConditionEvaluationResult.enabled("服务器已监听 " + host + ":" + port) : ConditionEvaluationResult.disabled("服务器未监听 " + host + ":" + port + ",跳过测试"); } // 端口连通性检测工具方法 private boolean isPortOpen(String host, int port) { try (Socket socket = new Socket(host, port)) { return true; } catch (Exception e) { return false; } } }
步骤2:测试类中使用自定义注解
根据测试场景指定配置属性名:
import org.junit.jupiter.api.Test; // 指定自定义的配置属性键 @DisabledOnServerNotListening(propertyNameHost = "service.host", propertyNamePort = "service.port") public class ServerDependentTests { @Test void runOnlyWhenServerIsUp() { // 测试逻辑 } }
补充:Spring Boot测试环境的配置读取
如果是Spring Boot项目,可通过ExtensionContext获取Spring容器的Environment来读取配置,替换上述步骤2的配置读取逻辑:
// 在evaluateExecutionCondition方法中添加 Optional<ApplicationContext> appContextOpt = extensionContext.getApplicationContext(); if (appContextOpt.isPresent()) { Environment env = appContextOpt.get().getEnvironment(); String host = env.getProperty(hostPropKey); Integer port = env.getProperty(portPropKey, Integer.class); // 后续检测逻辑 }
内容的提问来源于stack exchange,提问作者r-uu
相关产品推荐
相关产品推荐

