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クラスだけど、こういう時は便利。