我正在获得一个抽象类的模拟,并使用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