Laravel 8测试中Mocked方法未生效 调用返回原方法值问题
问题根因
Laravel 提供的partialMock/mock方法,本质是把配置好的mock对象绑定到服务容器中,只有当对应类是通过服务容器解析实例时,才会替换为mock对象。
你当前控制器代码里直接写$service = new Service()手动实例化类,完全绕过了服务容器的解析流程,实际调用的是原Service类的未mock实例,所以getNumber()还是返回原逻辑的100,和你mock配置的200无关。
修复方案
你只需要调整Service类的实例化方式,让它走服务容器解析即可,不需要修改现有测试代码,两种常用写法选其一就行:
- 写法1:使用
app()助手函数从容器解析实例
修改控制器fetch方法代码:
class ServiceController extends Controller { public function fetch(Request $request) { $service = app(Service::class); return [$service->getNumber()]; } }
- 写法2:使用依赖注入(Laravel推荐的最佳实践)
直接把Service类作为控制器方法的参数声明,Laravel会自动从容器解析对应实例注入:
class ServiceController extends Controller { public function fetch(Request $request, Service $service) { return [$service->getNumber()]; } }
修改完成后重新运行测试,就会得到预期的[200]返回结果。
内容的提问来源于stack exchange,提问作者user1392897
相关产品推荐
相关产品推荐

