这four year old question使用第三方库,我有点怀疑。PHP 7中的猴子修补程序
仅出于测试目的,我想重新定义其中一个类的静态方法。看看下面的例子:
class Driver {
public static function getVersion() : string
{
// Retrieves a version from a system executable
return some_system_call();
}
}
class Module {
public function methodToTest()
{
if (Driver::getVersion() === '4.0.0') {
// allow for additional options/methods
} else {
// use a subset
}
}
}
我需要为Driver::getVersion
返回不同的版本字符串。我通常会嘲笑这个班级,但是既然这不是注入,也不是一个实例,它不会起作用。
我可以更改源代码,添加方法和属性测试,以便被测试的类永远不需要调用Driver
,但在我看来,重构代码只是为了让测试“工作”并不是解决方案。
我正在考虑创建另一个Driver
类,并以某种方式加载它以代替原来的位置。
我该怎么做?
继承驱动程序类,使您需要的getVersion()方法使Driver2类,并使用Driver2而不是驱动程序 – SergeyLebedev
一方面,您可以使用'runkit'的扩展来操作/重新定义测试时的行为(如在phpunit中嘲笑)另一方面,如果可能的话,你应该防止静态方法。在你的例子中是没有显示的类的真正交互。它们是否立即加载,是否有命名空间等等。 – JOUM
Offtop,但有[version_compare](http://php.net/version_compare)功能 –