Lzh on GitHub

处理 Final 类/方法

PHP 中模拟对象的一个主要限制是,模拟被标记为 final 的类或方法很困难。final 关键字阻止了被这样标记的方法在子类中被替换(而子类化是模拟对象继承被模拟的类或对象的类型的方式)。

PHP 中模拟对象的一个主要限制是,模拟被标记为 final 的类或方法很困难。final 关键字阻止了被这样标记的方法在子类中被替换(而子类化是模拟对象继承被模拟的类或对象的类型的方式)。

最简单的解决方案是在 final 类中实现一个接口,并针对该接口进行类型提示/模拟。

然而,在某些第三方库中,这可能无法实现。Mockery 确实允许从被标记为 final 的类或具有 final 方法的类创建“代理模拟”。这提供了所有常见的模拟对象的好处,但生成的模拟对象不会继承被模拟对象的类类型,也就是说,它将无法通过任何 instanceof 比较。被标记为 final 的方法将被代理到原始方法,即,final 方法无法被模拟。

我们可以通过将我们希望模拟的实例化对象传递给 \Mockery::mock() 来创建一个代理模拟,即 Mockery 将生成一个指向真实对象的代理,并有选择地拦截方法调用,以设置和满足期望。

请参阅 部分测试替身 章节中关于代理部分测试替身的小节。