在 PHP 项目中,我有主单例和其他一些使用主单例的单例:
<?php
class SingletonMain
{
// Main singleton
// ...
}
class SingletonA
{
protected $main;
function __construct()
{
$main = SingletonMain::getInstance();
}
}
class SingletonB
{
protected $main;
function __construct()
{
$main = SingletonMain::getInstance();
}
}
?>
我想,也许在SingletonA和SingletonB中模拟SingletonMain的最简单方法是获取对SingletonMain实例的引用并执行以下操作:
- 将SingletonMain实例复制到
$temp
. - 将MockSingletonMain实例代替SingletonMain。“就地”是指在同一个参考位置,以便SingletonA和SingletonB可以立即使用新的模拟,就好像它是原始的SingletonMain一样。
- 测试。
- 从原位恢复SingletonMain实例。
$temp
那有可能吗?如果不是,那么在所有SingletonsABCD中模拟SingletonMain的最简单方法是什么......
$this->main = $my_mock
目前,我唯一想到的解决方案是在每个叶子单例中显式设置新的模拟,并最终使用正常的赋值运算符(并在测试之后)再次恢复它$this->main = SingletonMain::getInstance()
。
编辑
通过阅读几个答案,我意识到,我需要提供更多信息。我有大约 20-30 个这样的叶子单例。该应用程序在几年前并不是为了测试而设计的,所以现在我正在寻找绕过单例模式的最佳方法,而不会破坏任何东西并尽可能少地改变。