PHPUnit:私有服务无法替换+prophesize方法已弃用,求解决方案
解决PHPUnit中私有服务替换及
prophesize()弃用问题 一、私有服务无法替换的解决办法
私有服务不能直接通过容器的set()方法替换,有两种可行方案:
1. 测试环境临时设服务为公开
在测试专用的配置文件(比如tests/config/services_test.yaml)中,将目标服务标记为公开:
PayStubsCore\PayStubGeneratorBundle\Manager\PayStubViewManager: public: true
之后就能在测试中正常使用$this->client->getContainer()->set()替换服务。
2. 使用测试容器替换私有服务
如果使用Symfony 5.4及以上版本,测试容器允许替换私有服务,直接调用测试容器的replace()方法:
$testContainer = $this->client->getContainer()->get('test.service_container'); $testContainer->replace(PayStubViewManager::class, $fakePayStubViewManager);
二、替代弃用的prophesize()和reveal()
1. 改用PHPUnit原生MockBuilder
这是官方推荐的替代方案,无需依赖额外组件,直接创建Mock对象:
// 创建Mock实例 $fakePayStubViewManager = $this->createMock(PayStubViewManager::class); // 设置方法的返回值或行为 $fakePayStubViewManager->method('generateView') ->willReturn($yourExpectedResult); // 直接使用该Mock,无需reveal() $testContainer->replace(PayStubViewManager::class, $fakePayStubViewManager);
2. 继续使用Prophecy(需手动安装)
若习惯Prophecy的语法,可手动安装依赖包后继续使用:
- 安装依赖:
composer require --dev phpspec/prophecy phpspec/prophecy-phpunit
- 在测试类中引入Trait并使用:
use Prophecy\PhpUnit\ProphecyTrait; use PHPUnit\Framework\TestCase; class YourPayStubTest extends TestCase { use ProphecyTrait; public function testPayStubGeneration() { $fakePayStubViewManager = $this->prophesize(PayStubViewManager::class); $fakePayStubViewManager->generateView()->willReturn($expectedView); // 依然使用reveal()将预言对象转为可用的Mock $realMock = $fakePayStubViewManager->reveal(); $testContainer->replace(PayStubViewManager::class, $realMock); } }
内容的提问来源于stack exchange,提问作者Filip Stojanovic
相关产品推荐
相关产品推荐

