【PHP】リフレクションでprivateメソッドを単体テストする

著者:杉浦

【PHP】リフレクションでprivateメソッドを単体テストする

 あるメソッドをテストしたい時があります。あるメソッドをprotected, privateなどの閉じたアクセス権にしたい時があります。両方に該当するメソッドが現れたときどうすればよいでしょうか。リフレクションはそういった時に役に立つ仕組みです。
 PHP: リフレクション – Manual

情報工学においてリフレクション (reflection) とは、プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことを指す。

 要はPHPの実行中にリフレクションをしてprivateメソッドの構造を読み取り、読み取った内容を実行することによって、アクセス権の問題をクリアしてテストします。具体的には次の様にします。

    /**
     * @throws ReflectionException
     * @see UbxFile::createObsOfRover() テスト対象のprivateメソッド
     */
    public function testCreateObsOfRover()
    {
        $ubx = UbxFile::all()->first();// ひとまずリフレクション対象クラスのインスタンスを作成。

        $reflection = new ReflectionClass($ubx);// それを参照してリフレクションクラスを作成
        $method = $reflection->getMethod('createObsOfRover');// リフレクションクラスからメソッドの情報を取得
        $method->setAccessible(true);// メソッドのアクセス権をアクセス可能に上書き

        $res = $method->invoke();// privateメソッドであるUbxFile::createObsOfRover()が実行される
        
        self::assertSame('expected', $res);// 実行結果と期待する値を比較するassert
    }

 このような形でリフレクション機能を用いることで任意のメソッドに好き勝手アクセスできます。この仕組みはテストのみでなくフレームワークのマジックメソッド内部でもしばしば用いられています。

  • この記事いいね! (0)

著者について

杉浦 administrator