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()
相同。