You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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安装/更新时自动应用修改:

  1. 安装补丁插件:
composer require cweagans/composer-patches --dev
  1. 在composer.json的extra字段中添加补丁配置:
"extra": {
    "laravel": {
        "dont-discover": []
    },
    "patches": {
        "laravel/framework": {
            "Add void return type to TestCase setUp/tearDown": "patches/laravel-testcase-void-return.patch"
        }
    }
}
  1. 创建补丁文件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();
     }
  1. 执行命令应用补丁:
composer install

后续每次执行composer install或composer update时,插件都会自动将补丁应用到vendor目录的文件中。


内容的提问来源于stack exchange,提问作者anderlaini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:34:56