phpunit,依赖注入,测试存根:注入模拟还是匿名对象?

时间:2019-07-18 22:42:30

标签: unit-testing mocking phpunit

我有些疑问要注入什么。给出以下代码:

class A
{
    public function getSomething()
    {
        return 'something';
    }
}

class TestMe
{
    /**
     * @var A
     */
    private $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function greetings()
    {
        return 'Hello, '.$this->a->getSomething();
    }
}

我的测试A:

function testA()
{
    $a = new class() {
        public function getSomething()
        {
            return 'aAnonimus';
        }
    };

    $sut = new TestMe($a);

    $this->assertEquals('Hello, aAnonimus');
}

testB,相同,但带有模拟:

function testA()
{
    $a = $this->createMock(A::class);
    $a->method('getSomething')->willReturn('bMockery');

    $sut = new TestMe($a);

    $this->assertEquals('Hello, aMockery');
}

在第一个测试中,我只是注入一个普通对象。 但是第二个是Phpunit的方式:使用模拟对象。

问题是,从长远来看,谁会获胜?我发现了第一个挑战,对于第二个测试,您必须知道依赖项的类名(否则您将无法创建模拟)

1 个答案:

答案 0 :(得分:0)

从长远来看,第二种方法更好,因为在构造函数中具有类型提示会更好,因为这将不允许您提供简单的对象。 同样,当我们谈论UnitTests时,您应该测试某个类而不依赖于第三方库或其他服务逻辑。因此最好的方法是对所有属于已测试类的服务使用模拟程序