LoginSignup
56

More than 3 years have passed since last update.

PHPUnitのsetUp()を使ったら「must be compatible」とエラーが表示される

Posted at

前提

  • PHP 7.2.15-0ubuntu0.18.04.1 (cli) (built: Feb 8 2019 14:54:22) ( NTS )
  • PHPUnit 8.0.5 by Sebastian Bergmann and contributors.
  • Ubuntu 18.04.2 LTS

問題の記述

このエラーに遭遇した人は公式ドキュメントや他の方ブログなどを参考にして以下のような実装して、
エラーが出力されたのではないでしょうか?

class MovieTest extends TestCase {
    protected function setUp() {
        ・・・
    }
}

エラー内容

PHP Fatal error:  Declaration of MovieTest::setUp() must be compatible with PHPUnit\Framework\TestCase::setUp(): void in /{途中省略}/MovieTest.php on line 5

エラーの内容を簡単に記述すると、MovieTest::setUp()で記述したものとTestCase::setUp()で定義されてるものが一致する必要があるみたいです。

もう少しPHP関連の動きも交えてお話するとPHP7.0から型宣言ができるようになり、PHP7.2から戻り値の型宣言もできるようになりました。その動きに合わせてPHPUnitでも8.xから型宣言をする形式に実装を修正されているみたいです。そのことを踏まえると呼び出し側でも後で記載しているような実装をする必要があります。実際に試していないで推測ですが、7.xを利用している人は上記のようなエラーは表示されないのではないかと思います。

解決方法

先に結論から言うと、setUp()に戻り値型の: voidの宣言を記述すると上手くいきました。
(後述のTestCaseクラスと同じ記述にする)

protected function setUp(): void {
   ・・・
}

参考

参考までに実際に./vendor/phpunit/phpunit/src/Framework/TestCase.phpTestCaseクラスを見てみると以下の通りに記述されていますので、これと同じように記述すると良さそうです。(405行目あたりくらい)
関係ある部分だけ抜粋して記述しています。

abstract class TestCase extends Assert implements Test, SelfDescribing
{

     /**
     * This method is called before each test.
     */
    protected function setUp(): void
    {
    }
}

記述に誤字脱字や不適切な表現がありましたら、ご指摘いただけると幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56