はじめに
プライベート メソッドのモックは、内部のロジックをテストする場合に便利なテクニックです。実装の詳細を公開せずにクラスを作成します。ただし、カプセル化を破ってコードの整合性を損なうことを避けるために、慎重にこれに取り組むことが重要です。
問題
次の例を考えてみましょう:
<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 を使用してこれを実現するには:
テスト対象クラスのモック オブジェクトを作成します:
<code class="php">$mock = $this->getMockBuilder('A') ->disableOriginalConstructor() ->getMock();</code>
プライベート オブジェクトの予期される動作を定義します。メソッド:
<code class="php">$mock->expects($this->once()) ->method('c') ->will($this->returnValue(YOUR_STUBBED_VALUE));</code>
テスト内の元のインスタンスをモックに置き換えます:
<code class="php">$originalInstance = new A(); $this->reflection()->setProtectedProperty( $originalInstance, 'c', $mock );</code>
結論
テスト目的でプライベート メソッドを模擬したくなるかもしれませんが、カプセル化の原則を優先し、内部の詳細を不必要に公開しないようにすることが重要です。コードをリファクタリングして、プライベート メソッド モックに依存せずにテストできるようにすることを検討してください。
以上がPHPUnit でプライベート メソッドをモックする必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。