privateメソッドに対してUnitテストを実施する方法を紹介します。
0. 前提知識
アクセス修飾子をご存知でしょうか。 class内のメソッド・プロパティに対して外部からのアクセス要件を設定する情報です。public
, protected
, private
とあります。 private
は同一Classからしかアクセス出来ません。
つまり、Unitテストは他のClassから実行するものなので、通常のUnitテストではprivateメソッドに対してテストは実行出来ません。
では、どうやってUnitテストを実施していくのでしょうか。
Laravelには、privateメソッドに対してUnitテストを実行できる環境が用意されているので、そちらを使います。
1. ReflectionClassを利用する
実装方法は非常にシンプルです。
ExampleService
内にあるprivateMehtod
をUnitテストのPrivateMethodTest
で実行します。
ExampleService
はざっくりと下記
<?php class ExampleService { //省略 private function privateMehtod() // privateメソッドである { // メソッド内処理 return $result; } //省略 }
UnitテストPrivateMethodTest
は下記です。 ReflectionClass
の使い方を参照下さい。 下記にて、test_example() にてprivateMehtod
を実行してreturnを返しています。
<?php use ReflectionClass; use ExampleService; class PrivateMethodTest extends TestCase { private $reflection; private $service; public function setUp() { parent::setUp(); $this->service = new ExampleService(); $this->reflection = new ReflectionClass($this->service); } public function test_example() { $example_class = new ExampleService(); $method = $this->reflection->getMethod( 'privateMehtod' ); $method->setAccessible( true ); $result = $method->invoke( $this->service ); // assertでTest確認 // 省略 } }
2. privateメソッドに引数がある場合
privateMehtod
に引数 $params がある場合
<?php class ExampleService { //省略 private function privateMehtod( $params ) // privateメソッドである { // メソッド内処理 return $result; } //省略 }
変更箇所で記述しています。
- invoke( ) -> invokeArgs( )
- invokeArgs( ) の第2引数に$params を代入
- 第2引数 は array型で渡す必要があります。
<?php use ReflectionClass; use ExampleService; class PrivateMethodTest extends TestCase { // 省略 public function test_example() { // 省略 $result = $method->invokeArgs( $this->service, [$params] ); // 省略 } }
以上です。
ReflectionMethodを使う方法もありますが、今回はReflectionClass
を使う方法を紹介しました。