#InjectMocks 및 #Mock 주석을 통해 테스트 대상에 모의 개체를 자동으로 주입하여 PHPUnit을 사용한 단위 테스트 속도를 높입니다.
Leia a versão em português aqui.
개발 환경에 설치하려면:
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
, 그렇지 않으면 null 입니다.mock
을 생성합니다. 이 경우, 이 mock
TestCase 범위에 주입되지 않습니다.MockInjectException
예외가 발생합니다.관찰: 테스트 대상의 종속성 전체, 일부 또는 전혀에 #Mock 속성을 사용할 수 있습니다.
생성자를 사용하지 않고 TestCase 범위에 주입된 mock
를 생성합니다. 이 생성 동작은 TestCase::createMock()
과 동일합니다.