PHPUnit报错:类PHPUnit\Metadata\Api\DataProvider未找到(附复现步骤)
PHPUnit\Metadata\Api\DataProvider 类未找到错误 我通过Composer安装了PHPUnit,并编写了如下简单单元测试文件:
<?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class CheckFreeSeatsTest extends TestCase { public function testCanBeCreatedFromValidEmail(): void { $this->assertSame("foo", "foo"); } }
执行该测试时触发PHPUnit内部错误:
An error occurred inside PHPUnit.
Message: Class "PHPUnit\Metadata\Api\DataProvider" not found
Location: C:\www\vendor\phpunit\phpunit\src\Framework\TestBuilder.php:38#0 C:\www\vendor\phpunit\phpunit\src\Framework\TestSuite.php(477): PHPUnit\Framework\TestBuilder->build(Object(ReflectionClass), 'testCanBeCreate...')
已尝试执行 composer update、composer dumpautoload --dev、指定 --bootstrap=vendor/autoload.php 等操作,问题仍未解决。排查发现,autoload_static.php 中缺少 PHPUnit\Metadata\Api\DataProvider 的类映射,当前仅包含以下Metadata相关类:
'PHPUnit\\Metadata\\UsesFunction' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/UsesFunction.php', 'PHPUnit\\Metadata\\Version\\ComparisonRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php', 'PHPUnit\\Metadata\\Version\\ConstraintRequirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php', 'PHPUnit\\Metadata\\Version\\Requirement' => __DIR__ . '/..' . '/phpunit/phpunit/src/Metadata/Version/Requirement.php',
补充说明:我并未自行使用DataProvider,该类由TestBuilder.php调用,但对应的自动加载数据未生成。
复现步骤
以下Windows PowerShell脚本可在Docker Linux容器环境中完整复现问题,放入空目录执行即可:
Set-StrictMode -Version 3 $outDir = "$PSScriptRoot/out_dir" if(Test-Path $outDir) { Remove-Item -Force -Recurse $outDir | Out-Null } New-Item -ItemType Directory $outDir | Out-Null @' { "name": "root/app", "require-dev": { "phpunit/phpunit": "^10" } } '@ | Out-File $outDir\composer.json -Encoding ascii docker run --volume "$($outDir):/app" --rm -it composer/composer composer update @' <?php declare(strict_types=1); use PHPUnit\Framework\TestCase; final class EmailTest extends TestCase { public function testCanBeCreatedFromValidEmail(): void { $this->assertSame("foo", "foo"); } } '@ | Out-File $outDir\EmailTest.php -Encoding ascii docker run --volume "$($outDir):/app" --rm -it composer/composer ./vendor/bin/phpunit EmailTest.php
恳请提供解决思路。
内容的提问来源于stack exchange,提问作者Samuel

