Laravel运行PHPUnit报错setUp()不兼容,如何不修改vendor文件解决?
解决PHPUnit与Laravel TestCase的方法兼容问题
问题根源
你遇到的致命错误是因为Laravel 5.6的Illuminate\Foundation\Testing\TestCase类中setUp()/tearDown()方法没有声明:void返回类型,而你通过*安装的最新版PHPUnit(如PHPUnit 8+)要求这两个方法必须显式声明:void返回类型,导致方法声明不兼容。
不修改vendor目录的解决方案
方案1:降低PHPUnit版本到Laravel 5.6兼容的版本
Laravel 5.6官方兼容的PHPUnit版本为7.x系列,修改composer.json中require-dev里的PHPUnit版本约束:
"require-dev": { // ... 其他依赖项 "phpunit/phpunit": "^7.5" }
执行命令更新依赖:
composer update phpunit/phpunit --with-dependencies
这个方案最稳妥,完全贴合Laravel 5.6的生态兼容,无需修改任何代码。
方案2:在项目测试基类中重写方法
项目根目录下的tests/TestCase.php是所有测试类的父类,直接在这里重写setUp()和tearDown()并添加:void返回类型,覆盖Laravel框架的方法:
<?php namespace Tests; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { use CreatesApplication; /** * 设置测试环境 * * @return void */ public function setUp(): void { parent::setUp(); } /** * 清理测试环境 * * @return void */ public function tearDown(): void { parent::tearDown(); } }
所有自定义测试类都继承这个项目内的Tests\TestCase,即可解决兼容问题,且修改不会被Composer覆盖。
方案3:使用Composer补丁自动应用修改
通过cweagans/composer-patches插件给Laravel框架的TestCase打补丁,每次Composer安装/更新时自动应用修改:
- 安装补丁插件:
composer require cweagans/composer-patches --dev
- 在
composer.json的extra字段中添加补丁配置:
"extra": { "laravel": { "dont-discover": [] }, "patches": { "laravel/framework": { "Add void return type to TestCase setUp/tearDown": "patches/laravel-testcase-void-return.patch" } } }
- 创建补丁文件
patches/laravel-testcase-void-return.patch,内容为:
diff --git a/src/Illuminate/Foundation/Testing/TestCase.php b/src/Illuminate/Foundation/Testing/TestCase.php index 9f2f8d6d3b..e1a7a2b5c7 100644 --- a/src/Illuminate/Foundation/Testing/TestCase.php +++ b/src/Illuminate/Foundation/Testing/TestCase.php @@ -62,7 +62,7 @@ abstract class TestCase extends BasePHPUnitTestCase * * @return void */ - public function setUp() + public function setUp(): void { parent::setUp(); } @@ -72,7 +72,7 @@ abstract class TestCase extends BasePHPUnitTestCase * * @return void */ - public function tearDown() + public function tearDown(): void { parent::tearDown(); }
- 执行命令应用补丁:
composer install
后续每次执行composer install或composer update时,插件都会自动将补丁应用到vendor目录的文件中。
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

