Laravel:privateメソッドに対してUnitテストを実施する方法

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 を使う方法を紹介しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です