🦀

laravel8¦unitテストでprivateのメソッドもテストする

2021/09/16に公開

やりたいこと

そのままの通りですがユニットテストでprivateのメソッドもテストする方法を忘れがちなのでまとめました。
laravelの機能というよりPHPの機能を使っています。

環境

  • laravel 8
  • php 7.3

privateメソッドのテスト

privateメソッドのテストですが調べたところ2つの方法でできるようでした。

ReflectionMethodを使用する方法

$class = new \App\Service\User\TestClass();
$method = new \ReflectionMethod($class, 'privateMethodName');
$method->setAccessible(true);
$result = $method->invokeArgs($class, [$param1, $param2]);

ReflectionClassを使用する方法

$reflection = new \ReflectionClass('App\Service\User\TestClass');
$method = $reflection->getMethod('privateMethodName');
$method->setAccessible(true);
$result = $method->invokeArgs(new \App\Service\User\TestClass(), [$param1, $param2]);

どちらでもテスト可能でしたが、いずれにしても$method->setAccessible()にtrueを渡す必要があり、これをすることでprivateメソッドにアクセス可能になるようでした。
他にもgetValue()を使うことで外からprivate変数を知ることもできます。便利…
PHP:リフレクション

私の場合は名前空間の異なる同じ名前のクラスが複数あったためうまく反応せず、useしていたとしてもクラス名だけで呼ぶとエラーになるため 名前空間ごと指定したら動作するようになりました🕯

Discussion