PHPUnit中disableOriginalConstructor与disableOriginalClone作用及默认禁用疑问
聊聊PHPUnit里
disableOriginalConstructor()和disableOriginalClone()的那些事儿 1. disableOriginalConstructor()到底是干啥的?
简单说,这个方法就是用来让你创建Mock对象时,跳过原类的构造函数调用。
你想啊,很多业务类的构造函数可能要搞一堆麻烦事:比如依赖数据库连接、加载配置文件、甚至发起网络请求——这些在单元测试里都是我们要避免的,毕竟单元测试要测的是类的核心逻辑,不是它的依赖环境。用了这个方法,Mock出来的对象就不会触发原构造函数的这些逻辑,干干净净的,方便我们专注测试目标方法。
2. 既然默认就禁用了构造和克隆,为啥还要显式写这俩方法?
你这个问题问到点子上了!确实现在不少PHPUnit版本里,Mock默认就不会调用原构造和克隆,但显式写出来依然很有必要:
- 版本兼容不踩坑:PHPUnit的默认规则不是一直不变的,比如老版本(像PHPUnit 4及更早)里,Mock默认是会跑原构造函数的。如果你的测试代码要在不同环境跑,显式调用这些方法能保证不管版本怎么变,行为都一致,不会突然因为升级PHPUnit就一堆测试失败。
- 代码一看就懂:别的开发者看你代码的时候,不用去查“现在PHPUnit默认会不会调用原构造”,一眼就知道这个Mock对象不会执行原类的构造/克隆逻辑,意图清晰,减少沟通成本。
- 灵活调整行为:有时候你可能临时需要让Mock执行原构造函数(比如调用
enableOriginalConstructor()),之后再创建新Mock的时候,就得显式用disableOriginalConstructor()把行为改回来,这种场景下就离不开它。
举个实际场景的例子:
// 临时让Mock执行原构造函数,比如要测试构造相关的逻辑 $tempStub = $this->getMockBuilder(UserService::class) ->enableOriginalConstructor() ->getMock(); // 之后创建常规测试用的Mock,就得显式禁用原构造 $normalStub = $this->getMockBuilder(UserService::class) ->disableOriginalConstructor() ->getMock();
你贴的那段示例代码把一堆配置链式调用,其实是一种很稳妥的写法——不管默认规则咋样,我明确指定我要的Mock行为,彻底避免环境变化带来的意外。
内容的提问来源于stack exchange,提问作者wulev
相关产品推荐
相关产品推荐

