簡介
模擬私有方法可能是測試邏輯的有用技術。類別而不暴露其實作細節。但是,請務必謹慎處理此問題,以避免破壞封裝並損害程式碼的完整性。
問題
考慮以下範例:
<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 實現此目的:
為被測試的類別建立一個模擬物件:
<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中文網其他相關文章!