1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP / Laravel】privateメソッドのunitテストをする

Posted at

環境

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);
とします。

以上です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?