現在の位置: ホーム> 最新記事一覧> PHPユニットテスト実践ガイド:モックオブジェクトを使用してテスト効率を向上させる方法

PHPユニットテスト実践ガイド:モックオブジェクトを使用してテスト効率を向上させる方法

M66 2025-09-29

ユニットテストにおけるモックオブジェクトの概要

模擬オブジェクトは、クラスまたはインターフェイスの動作をシミュレートするために使用される単体テストで一般的に使用されるテストの代役であり、リターン値またはスロー例外を正確に制御できます。モックオブジェクトを介して、開発者は実際の依存関係をインスタンス化することなく、関数またはメソッドのインタラクティブロジックをテストできます。

モックオブジェクトを作成します

PHPでは、GetMockBuilderメソッドを使用してモックオブジェクトを作成できます。この方法は、次のパラメーターを受け入れます。

  • $ OriginalClassName:シミュレートするクラスまたはインターフェイスの名前。
  • $メソッド(オプション):シミュレーションを必要とするメソッドの配列。
 // シミュレーション MyInterface インタフェース
$mock = $this->getMockBuilder(MyInterface::class)
             ->getMock();

// シミュレーション MyClass 类并シミュレーション其方法
$mock = $this->getMockBuilder(MyClass::class)
             ->setMethods(['myMethod'])
             ->getMock();

モックオブジェクトを構成します

モックオブジェクトを作成した後、返品値の設定や例外のスローなど、メソッドメソッドを使用して動作を構成できます。

 // 構成 Mock 返品するオブジェクト 'foo'
$mock->method('getMyMethod')
     ->willReturn('foo');

// 構成 Mock 例外をスローするオブジェクト
$mock->method('myOtherMethod')
     ->willThrowException(new RuntimeException());

実用的なケース

ユニットテストでモックオブジェクトを使用する方法を示す例を以下に示します。 MyServiceクラスに依存するMyClassクラスがあるとします。

 class MyClass
{
    private $myService;

    public function __construct(MyService $myService)
    {
        $this->myService = $myService;
    }

    public function doSomething(): string
    {
        return $this->myService->getData();
    }
}

MyServiceクラスには、文字列「Foo」を返すGetDataメソッドが含まれています。 MyClass :: DosomThe Methodをテストするには、模擬オブジェクトを使用できます。

 class MyClassTest extends PHPUnit_Framework_TestCase
{
    public function testDoSomething()
    {
        // 作成する MyService Mock 物体
        $mockService = $this->getMockBuilder(MyService::class)
                            ->setMethods(['getData'])
                            ->getMock();

        // 構成 Mock 物体戻る "bar"
        $mockService->method('getData')
                    ->willReturn('bar');

        // 作成する MyClass インスタンスと注入 Mock 物体
        $myClass = new MyClass($mockService);

        // 断言 MyClass::doSomething 戻る "bar"
        $this->assertEquals('bar', $myClass->doSomething());
    }
}

このテストでは、myServiceの模擬オブジェクトを作成し、その返品値を「bar」に設定しました。次に、mockオブジェクトをmyclassインスタンスに注入し、最後に、myclassとmyserviceの間の相互作用がアサーションを通じて正しいことを確認します。

モックオブジェクトを使用することにより、開発者は、実際のサービスや複雑な環境に依存することなく、単体テストの依存関係とビジネスロジックを効率的に検証できます。