Laravel Mock多shouldReceive()语句仅单个生效如何解决?
Laravel 同个类多个方法独立配置Mock规则方案
你原本的分条调用 shouldReceive() 的写法本身是符合规范的,仅单个方法Mock生效通常是容器实例被覆盖导致的,按以下步骤调整即可:
标准写法
多个方法的Mock规则完全独立配置的写法如下:
use Mockery\MockInterface; $mock = $this->mock(Service::class, function (MockInterface $mock) { // 独立配置init方法的调用次数、入参、返回值规则 $mock->shouldReceive('init') ->once() ->with($param1, $param2) ->andReturn('init方法mock返回值'); // 独立配置process方法的规则,和上方init方法的配置互不影响 $mock->shouldReceive('process') ->twice() ->with($param3) ->andReturn('process方法mock返回值'); });
生效校验规则
调整后仍不生效可排查以下三点:
- 确认Mock配置完成后,没有再通过
App::bind()、App::singleton()、$this->instance()等方法重新绑定Service::class到容器,否则会直接覆盖之前的Mock实例 - 确认要Mock的两个方法均为public公共方法,Mockery默认不支持Mock protected、private类型的非公共方法
- 如果
Service::class原本是单例绑定,配置Mock前先调用App::forgetInstance(Service::class)清空容器中已有的实例,避免复用旧的非Mock实例
部分方法Mock配置
如果仅需要Mock指定方法,剩余方法走类本身的原生逻辑,添加makePartial()即可:
$mock = $this->mock(Service::class, function (MockInterface $mock) { $mock->makePartial(); // 仅Mock init方法 $mock->shouldReceive('init')->once()->andReturn('mock返回值'); // process方法未配置Mock规则,会直接执行Service类中的原生process逻辑 });
效果验证
配置完成后通过容器取出实例调用即可触发对应规则:
$service = App::make(Service::class); // 调用后会命中各自的Mock规则 echo $service->init($param1, $param2); // 输出init方法mock返回值 echo $service->process($param3); // 输出process方法mock返回值
内容的提问来源于stack exchange,提问作者megaman
相关产品推荐
相关产品推荐

