PHPでprivateやprotectedなメソッドをテストする

前回の続きでさらに private や protected でアクセス制限をされているメソッドのテストはどうするのかというのに遭遇したので調べた。

<?php
final class ProtectedTest extends TestCase
{
    public function test_Protectedなメソッドのテスト()
    {
        $expected = '結果';

        $class = new TestClass(); // テストを作る

        // リフレクションクラスを作る
        $reflection_class = new \ReflectionClass($class);

        // メソッドの指定
        $method = $reflection_class->getMethod('test_method');

        // アクセス権限を追加
        $method->setAccessible(true);

        // メソッドの実行,引数は invokeの第2引数に渡す
        $actual = $method->invoke($class, 'input');

        $this->assertEquals($expected, $actual);
    }
}

ReflectionClass を使うとアクセス権の管理ができるようになるので、これを利用する。上記を組み合わせて先日の Abstract な抽象クラスでもテストができる。

参考

関連ポスト