ホームページ > バックエンド開発 > PHPチュートリアル > PHPUnit でプライベート メソッドをモックする必要があるのはどのような場合ですか?

PHPUnit でプライベート メソッドをモックする必要があるのはどのような場合ですか?

Barbara Streisand
リリース: 2024-10-30 04:55:28
オリジナル
913 人が閲覧しました

 When Should You Mock Private Methods in PHPUnit?

PHPUnit を使用したプライベート メソッドのモック

はじめに

プライベート メソッドのモックは、内部のロジックをテストする場合に便利なテクニックです。実装の詳細を公開せずにクラスを作成します。ただし、カプセル化を破ってコードの整合性を損なうことを避けるために、慎重にこれに取り組むことが重要です。

問題

次の例を考えてみましょう:

<code class="php">class A {
  public function b() { 
    // some code
    $this->c(); 
    // some more code
  }

  private function c(){ 
    // some code
  }
}</code>
ログイン後にコピー

PHPUnit を使用して、プライベート メソッド c() の結果をスタブして、パブリック関数 b() の「その他のコード」部分をテストするにはどうすればよいですか?

解決策

オプション 1: リファクタリングを検討する

一般に、プライベート メソッドを直接テストすることはベスト プラクティスとは見なされません。代わりに、クラスのパブリック API のテストに重点を置きます。内部実装の詳細はすべてブラック ボックスと見なす必要があります。

オプション 2: モックを使用する (注意して続行)

ただし、特定のシナリオでは、プライベート メソッドのモックが使用される可能性があります。必要。 PHPUnit を使用してこれを実現するには:

  1. テスト対象クラスのモック オブジェクトを作成します:

    <code class="php">$mock = $this->getMockBuilder('A')
                ->disableOriginalConstructor()
                ->getMock();</code>
    ログイン後にコピー
  2. プライベート オブジェクトの予期される動作を定義します。メソッド:

    <code class="php">$mock->expects($this->once())
        ->method('c')
        ->will($this->returnValue(YOUR_STUBBED_VALUE));</code>
    ログイン後にコピー
  3. テスト内の元のインスタンスをモックに置き換えます:

    <code class="php">$originalInstance = new A();
    $this->reflection()->setProtectedProperty(
       $originalInstance,
       'c',
       $mock
    );</code>
    ログイン後にコピー
  4. 通常どおりテストを実行します。

結論

テスト目的でプライベート メソッドを模擬したくなるかもしれませんが、カプセル化の原則を優先し、内部の詳細を不必要に公開しないようにすることが重要です。コードをリファクタリングして、プライベート メソッド モックに依存せずにテストできるようにすることを検討してください。

以上がPHPUnit でプライベート メソッドをモックする必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート