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
相关产品推荐
相关产品推荐

