PHPはReflectionMethodを使うと、publicでないメソッドをクラス外から実行できるようになります。
protectedやprivateメソッドのテストコードを書きたいときに使えます。
次のsampleMethodのユニットテストを書く例です。
SampleClass.php
namespace SampleNamespace;
class SampleClass {
private function sampleMethod() {
return true;
}
}
ReflectionMethodのコンストラクタ引数で対象クラスとメソッドを指定。
setAccessible(true)でアクセス可能になり、invokeで実行できます。
SampleClassTest.php
require_once('SampleClass.php');
class SampleClassTest extends PHPUnit_Framework_TestCase {
public function test_sample() {
$sample = new \SampleNamespace\SampleClass();
$reflection_method = new ReflectionMethod('SampleNamespace\SampleClass', 'sampleMethod');
$reflection_method->setAccessible(true);
$this->assertTrue($reflection_method->invoke($sample));
}
}
setAccessibleメソッドのドキュメントが参考になりました。
http://jp.php.net/manual/ja/reflectionmethod.setaccessible.php