環境
PHP8
Laravel9
やりたいこと
privateメソッドをテストしようとするとテストできない、、、
そこでprivateメソッドのunitテストをする方法を2つご紹介します。
今回のテスト対象のクラスとメソッドは以下のようなものとします。
TestService.php
class TestService
{
//省略
private function targetPrivateMethod ($familyName, $firstName) {
return $familyName . '' . $firstName;
}
}
方法
1.ReflectionClass
を使用する
PrivateMethodTest.php
use ReflectionClass;//追加
class PrivateMethodTest extends TestCase
{
$familyName = '山田';
$firstName = '太郎';
$reflection = new ReflectionClass(TestService::class);//対象のクラス
$method = $reflection->getMethod('targetPrivateMethod');//対象のprivateメソッド
$method->setAccessible(true);//アクセスを可能にする
$result = $method->invokeArgs(new TestService(), [$familyName, $firstName]);//実行
}
2.ReflectionMethod
を使用する
PrivateMethodTest.php
use use ReflectionMethod;//追加
class PrivateMethodTest extends TestCase
{
$familyName = '山田';
$firstName = '太郎';
$class = new TestService();//クラスのインスタンスを作成
$method = new ReflectionMethod($class, 'privateMethodName');//対象クラスとprivateメソッドを指定
$method->setAccessible(true)//アクセスを可能にする
$result = $method->invokeArgs($class, [$familyName, $firstName]);//実行
}
ここで一点注意点ですが、テスト対象のprivateメソッドに引数がなかった場合、
$method->invoke($class);
とします。
以上です。