0Pricing
PHP Academy · レッスン

PHPUnitで依存関係をモックする

モックオブジェクトを作成して単体を分離し、協調オブジェクトの動作を制御します

「PHPUnitで依存関係をモックする」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

なぜモックを使うのか

モックは、実際の依存関係(データベース、メールサービス、HTTP クライアント)を制御可能な偽物に置き換えます。これにより、テストを高速かつ分離された決定的なものにできます。

createMock()

createMock(ClassName::class) は、クラスのすべてのメソッドを実装するモックオブジェクトを作成します。デフォルトでは null を返します。

<?php
$mailer = $this->createMock(Mailer::class);
// All methods return null by default

メソッド呼び出しの期待値設定

expects() と、once()、exactly(3)、never()、any() などのマッチャーを使って、メソッドが正しい回数呼び出されることを検証します。

<?php
$mailer->expects($this->once())
       ->method("send")
       ->with("user@example.com", "Welcome!");

戻り値のスタブ設定

willReturn() を使って、モックメソッドが特定の値を返すように設定します。

<?php
$repo = $this->createMock(UserRepository::class);
$repo->method("find")
     ->willReturn(new User(id: 1, name: "Alice"));

willReturnMap()

willReturnMap() を使うと、引数に応じて異なる値を返せます。

<?php
$cache->method("get")
      ->willReturnMap([
          ["key:1", "value-one"],
          ["key:2", "value-two"],
      ]);

willThrowException()

モックに例外をスローさせ、エラー処理の経路をテストします。

<?php
$repo->method("find")
     ->willThrowException(new DatabaseException("Connection lost"));

引数マッチャー

with() 内で引数マッチャーを使うと、柔軟なアサーションを記述できます。$this->anything()、$this->equalTo()、$this->isInstanceOf() などがあります。

<?php
$logger->expects($this->once())
       ->method("log")
       ->with($this->stringContains("error"));

部分モック(getMockBuilder)

getMockBuilder() と onlyMethods() を使うと、特定のメソッドだけをモックし、その他のメソッドでは実際の実装を維持できます。

<?php
$svc = $this->getMockBuilder(EmailService::class)
            ->onlyMethods(["sendRaw"])
            ->getMock();
$svc->method("sendRaw")->willReturn(true);

スパイパターン

スパイはすべての呼び出しを記録するため、実行後にその内容をアサートできます。PHPUnit のモックは、any() を使って引数を取得することでスパイとしても機能します。

モックの注入

コンストラクターインジェクションを使って、テスト対象クラスにモックを渡します。これは、テストしやすく疎結合なコードの標準的なパターンです。

<?php
$service = new NotificationService($mailer, $logger);
$service->notify($user);

インターフェースと具象クラスのモック

インターフェースのモックが推奨されます。実装の詳細がテストに入り込まず、実際の実装が変更されてもテストの有効性を維持できます。

まとめ

依存関係を分離するには createMock() を使います。expects()->method()->with()->willReturn() を使って期待値とスタブを設定します。モックはコンストラクターから注入します。

クイックチェック

モックに特定の値を返させるメソッドはどれですか?

よくある質問

「PHPUnitで依存関係をモックする」レッスンは無料ですか?

はい。「PHPUnitで依存関係をモックする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「PHPUnitで依存関係をモックする」で何を学びますか?

モックオブジェクトを作成して単体を分離し、協調オブジェクトの動作を制御します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「PHPUnitで依存関係をモックする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. PHPUnitのセットアップと最初のテスト
  2. アサーションとテストメソッド
  3. パラメータ化テスト用のデータプロバイダー
  4. PHPUnitで依存関係をモックする
← PHP Academyに戻る