PHPUnit中Mock类无法禁止构造函数执行该如何解决?
问题原因
- 你仅生成了Mock对象,但没有将该Mock替换到框架的服务容器中。你当前测试的是接口请求,控制器依赖的
App\Helpers\Client是由服务容器自动注入的,你单独创建的Mock实例和容器的绑定无关,请求处理时容器仍然会实例化原始类,因此触发构造函数。 createMock方法本身默认就会禁用原构造函数,你生成Mock的逻辑本身没有问题。
修复方案
修改你的setUp方法,生成Mock后将其绑定到服务容器:
public function setUp(): void { parent::setUp(); // 生成Mock $mockClient = $this->createMock(\App\Helpers\Client::class); // 可在此处自定义Mock的方法返回值 // $mockClient->method('你要模拟的方法名')->willReturn('自定义返回结果'); // 将Mock绑定到服务容器,后续容器解析Client类时都会返回这个Mock实例 $this->app->instance(\App\Helpers\Client::class, $mockClient); }
其他排查点
- 检查你业务代码中
Client类的实例化方式,如果存在直接new Client()的硬编码逻辑,服务容器的绑定不会生效,必须将硬编码实例化改为依赖注入,或者给Client类增加静态实例替换逻辑。 - 如果你使用Mockery生成Mock,不要调用
makePartial()方法,该方法会执行原构造函数,直接使用Mockery::mock(\App\Helpers\Client::class)即可禁用构造函数。
内容的提问来源于stack exchange,提问作者DreamyT
相关产品推荐
相关产品推荐

