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

  • 2019年5月16日
  • PHP

 あるメソッドをテストしたい時があります。あるメソッドを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
    }

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

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG