You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 4.4测试:如何通过容器向服务传依赖并Mock服务

Symfony 4.4 测试中Mock依赖的正确处理方式

关于self::$container->get()传递依赖的问题

直接调用self::$container->get('App\Services\ClassToTest')是从容器获取预配置的实例,容器会按照原有DI配置注入所有真实依赖,包括未Mock的TokenService,所以这种方式无法传入你自定义的Mock对象。

是否必须手动实例化类?

不是必须,但手动实例化是精准替换依赖的直接方式之一。示例代码如下:

// 创建TokenService的Mock对象
$tokenMock = $this->createMock(\App\Services\TokenService::class);
// 其他不需要Mock的依赖,直接从容器获取真实实例
$dependencyOne = self::$container->get(\App\Services\DependencyOne::class);

// 手动实例化待测试类,传入真实依赖与Mock对象
$classToTest = new \App\Services\ClassToTest($dependencyOne, $tokenMock);

此外,Symfony 4.4也支持容器替换服务的方式,无需手动实例化:

// 创建Mock对象
$tokenMock = $this->createMock(\App\Services\TokenService::class);
// 让测试容器返回Mock对象替代原TokenService
self::$container->set(\App\Services\TokenService::class, $tokenMock);

// 从容器获取待测试类,会自动注入Mock的TokenService
$classToTest = self::$container->get(\App\Services\ClassToTest::class);

这种方式适合需要保留容器原有配置的场景,无需手动处理所有依赖。

仅Mock一个依赖,是否需要传递所有其他依赖?

分两种场景:

  • 手动实例化时:是的,因为类的构造函数要求传入所有参数。但你可以从容器中获取其他真实依赖,无需手动创建,减少重复代码。
  • 容器替换服务时:不需要,容器会自动注入其他真实依赖,你只需要替换要Mock的那一个服务即可。

内容的提问来源于stack exchange,提问作者naspy971

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:23:01