PHPUnit中Mock对象应设置为原类还是MockObject类型?
PHPUnit Mock对象类型声明方案
- 优先使用实际业务类作为类型声明
你当前的示例代码仅调用原业务类SomeClass的内置方法,这种场景直接声明为SomeClass是最优选择:- PHPUnit生成的Mock对象默认继承原业务类,符合PHP类型约束,运行不会报错
- IDE可正常识别并补全原业务类的所有方法,不会出现补全失效的问题
- 当需要调用MockObject专属方法时的处理
如果你需要在测试方法内调用expects()、method()等MockObject接口自带的方法配置Mock行为,可根据PHP版本选择方案:- PHP 8.0及以上版本:使用交集类型声明
SomeClass&MockObject $someClassMock,可同时支持原业务类和MockObject方法的IDE补全,完全兼容运行逻辑,示例如下:/** * @dataProvider getTestDataProvider * @throws Exception */ public function testExampleData( Request $request, Response $expected, SomeClass&MockObject $someClassMock ): void { // 同时支持两类方法的补全 $someClassMock->expects($this->once())->method('getData')->willReturn($expected); $result = $someClassMock->getData($request); $this->assertEquals($expected, $result); } - PHP 8.0以下版本:仍保留
SomeClass作为主类型声明,需要调用MockObject方法前添加单行临时类型标注即可:/** @var MockObject $someClassMock */
- PHP 8.0及以上版本:使用交集类型声明
- 不推荐单独使用
MockObject作为类型声明
单独声明为MockObject时,IDE无法识别原业务类的内置方法,会直接导致业务方法补全失效,仅在测试逻辑完全不需要调用原类方法的极端场景下可以使用。
内容的提问来源于stack exchange,提问作者The50
相关产品推荐
相关产品推荐

