PHPUnit方法调用断言对抽象类失败

时间:2014-05-02 00:19:36

标签: php unit-testing mocking phpunit abstract-class

我正在获取一个抽象类的模拟,并使用expects来验证特定方法是否使用某些特定值调用两次。即使生产代码正确,此断言也会失败。这是我使用getMockForAbstractClass方法创建模拟的时候。现在,当我创建这个抽象类的具体衍生物并将其提供给getMock时,它确实有效。然而,这种方法并不好,所以我想知道我是否可以避免它。

首次尝试,使用不起作用的getMockForAbstractClasshttp://pastebin.com/09n92Q6h

使用具体衍生物进行的第二次尝试:http://pastebin.com/SxxgN5Cw

1 个答案:

答案 0 :(得分:0)

ocramius的帮助下,我发现抽象类的具体方法默认情况下不会被模拟掉。需要在getMockForAbstractClass中指定需要模拟的具体方法。

private function getMockedAbstractClass($className, array $methods)
{
    return $this->getMockForAbstractClass(
        $className,
        array(),
        '',
        true,
        true,
        true,
        $methods
    );
}

使用模拟构建器界面可以更好:

    $platform = $this->getMockBuilder($className)
        ->setMethods($methods)
        ->getMockForAbstractClass();

完整的解决方案可以在这里看到:https://github.com/doctrine/dbal/pull/586/files