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


PHPUnit method invocation assertion failing for abstract class

我正在获得一个抽象类的模拟,并使用expects来验证使用某些特定值调用两次特定方法。即使生产代码是正确的,这个断言也是错误的。这是我使用getMockForAbstractClass方法创建模拟的时候。现在,当我为这个抽象类创建一个具体的导数,并把它输入到getMock中,它是有效的。然而,这种方法并不好,所以我想知道我是否可以避免它。

第一次尝试,使用不工作的getMockForAbstractClass: http://pastebin.com/09n92Q6h

第二次尝试,使用具体的导数,这是可行的:http://pastebin.com/SxxgN5Cw

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

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

使用mock构建器接口来完成这个任务会更好一些:

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

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