#InjectMocks および #Mock アノテーションを介してテスト対象にモックを自動的に挿入し、PHPUnit による単体テストを高速化します。
レイアはポルトガル語で生きています。
開発環境にインストールするには:
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 属性は、テスト対象の依存関係のすべて、一部、またはまったく使用しないことができます。
コンストラクターを使用せずに、TestCase スコープに挿入されるmock
を作成します。この作成動作はTestCase::createMock()
と同じです。