PHPでPrivateなメソッドをテストする

ユニットテストを書くとき、privateメソッドやprotectedメソッドまでテストすべきかどうかというのはまあ微妙な所で、ユニットテストは外から見える振る舞いだけをカバーしておいて、内部の実装は自由にしておくべきなのかもしれないけれども、内部メソッドのテストまで書く場合の方法について。

内部メソッドにはそのままではアクセスできないので、ReflectionのsetAccesibleメソッドを使用して公開状態を変更してやることにより、内部メソッドまでアクセスすることができるようになる。

PHPUnitでテストする場合、こんな感じ。

<?php
class Foo {
    private function bar() {
        return 'hello!';
    }
}

class FooTestCase extends PHPUnit_Framework_TestCase {
    public function testBar(){
        $method = new ReflectionMethod('Foo', 'bar');
        $method->setAccessible(true);
        $this->assertEquals('hello!', $method->invoke(new Foo));
    }
}

PHPだとそんなに出番のないReflectionクラスだけど、こういう時は便利。