inject mocks
v3.0.0
透過 #InjectMocks 和 #Mock 註解自動將模擬注入測試對象,以加快 PHPUnit 的單元測試。
萊婭 (Leia) 與葡萄牙語版本相同。
在開發環境中安裝:
composer require --dev silasyudi/inject-mocks
在測試類別中使用 #InjectMocks 和 #Mock 註釋,您可以自動將模擬注入到測試物件中。
在典型的場景中,我們會這樣做:
class SomeTest extends PHPUnit Framework TestCase
{
public void testSomething()
{
$ someDependency = $ this -> createMock (Dependency::class);
$ anotherDependency = $ this -> createMock (AnotherDependency::class);
. . .
$ subject = new Service ( $ someDependency , $ anotherDependency , ...);
. . .
}
...
這種方法帶來了維護的困難,因為如果測試主題發生變化,無論是添加、減少還是替換依賴項,您都必須在每次測試中更改它。
透過 #InjectMocks/#Mock 註釋,我們抽象化了這些測試主題的變更。例子:
use SilasYudi InjectMocks InjectMocks ;
use SilasYudi InjectMocks Mock ;
use SilasYudi InjectMocks MockInjector ;
class SomeTest extends PHPUnit Framework TestCase
{
#[Mock]
private Dependency $ someDependency ;
#[Mock]
private AnotherDependency $ anotherDependency ;
. . .
# [InjectMocks]
public function setUp() : void
{
MockInjector:: inject ( $ this );
}
public void testSomething ()
{
// $this->subject e as dependências já estão instanciadas.
}
...
與上一主題中的範例一樣,#InjectMocks 屬性必須放置在要測試的測試主體的屬性上,且 #Mock 屬性必須放置在與要模擬或依賴的依賴項對應的屬性上註入。
之後,使用MockInjector::inject($this)
語句運行注入器服務。可以在每個測試或setUp
中聲明此執行。
執行注入器後,用#InjectMocks註解的service
將是測試類別範圍內可用的真實實例,而用#Mock註解的每個依賴項將是MockObject的實例,透過建構子注入到測試主體中,並將也可以在測試類別的範圍內使用。
MockInjectException
異常。#InjectMocks 和 #Mock 獨立工作或一起工作。每一項的詳細資料:
它將透過建構函式建立一個真實的實例,如果建構函式中有參數,則每個參數將按以下順序使用下列值:
mock
(如果存在);default
值;null
則為null
;mock
。在這種情況下,這個mock
不會被注入到TestCase作用域中;MockInjectException
例外。觀察:您可以對所有、部分測試物件的依賴項使用 #Mock 屬性,或不使用 #Mock 屬性。
將會建立一個注入 TestCase 範圍的mock
,而不使用建構子。此創建行為與TestCase::createMock()
相同。