首頁 >後端開發 >php教程 >什麼時候應該在 PHPUnit 中模擬私有方法?

什麼時候應該在 PHPUnit 中模擬私有方法?

Barbara Streisand
Barbara Streisand原創
2024-10-30 04:55:28915瀏覽

 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:利用 Mock(謹慎操作)

但是,在某些情況下,模擬私有方法可能會必要的。要使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn