PHPUnit 10中parseTestMethodAnnotations()替代方案求助
PHPUnit 10.4 替代 parseTestMethodAnnotations() 的实现方案
PHPUnit 10 彻底重构了元数据注解解析体系,原PHPUnit\Util\Test::parseTestMethodAnnotations()方法被移除,需通过PHPUnit\Metadata组件下的注解解析类实现相同功能。以下是具体替代实现:
核心依赖类
需引入PHPUnit 10内置的元数据解析相关类:
use PHPUnit\Metadata\Annotation\Parser\DocBlock; use PHPUnit\Metadata\Collection; use ReflectionMethod; use ReflectionClass;
完整替代函数
这个函数会解析指定测试类和方法的所有注解,返回与旧方法结构近似的数组:
function getTestMethodAnnotations(string $className, string $methodName): array { // 初始化注解解析器 $parser = new DocBlock(); // 解析方法级注解 $methodReflect = new ReflectionMethod($className, $methodName); $methodMetadata = $parser->parseMethod($methodReflect); // 解析类级注解 $classReflect = new ReflectionClass($className); $classMetadata = $parser->parseClass($classReflect); // 合并并转换为旧格式的注解数组 $annotations = []; $mergeMetadata = fn(Collection $metadata) => array_walk($metadata, function($item) use (&$annotations) { $key = $item->name(); $value = $item->hasArguments() ? $item->arguments()[0] : true; if (!isset($annotations[$key])) { $annotations[$key] = []; } $annotations[$key][] = $value; }); $mergeMetadata($classMetadata); $mergeMetadata($methodMetadata); return $annotations; }
使用示例
调用函数获取指定测试方法的注解:
// 假设测试类为UserTest,测试方法为testCreateUser $annotations = getTestMethodAnnotations(UserTest::class, 'testCreateUser'); // 输出示例:如果方法有@dataProvider userDataProvider注解 // 会得到 ['dataProvider' => ['userDataProvider']] print_r($annotations);
精准筛选特定注解
如果只需要获取某一类注解(比如数据提供者),可以直接通过元数据集合的筛选方法优化:
$parser = new DocBlock(); $methodReflect = new ReflectionMethod(UserTest::class, 'testCreateUser'); $dataProviders = $parser->parseMethod($methodReflect)->filterByName('dataProvider'); foreach ($dataProviders as $dp) { echo "数据提供者方法:{$dp->arguments()[0]}"; }
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

